показва получените данни от тук Сега Pubnub в recycleView android

Наричам този метод при стартиране Activity. Искам да се показва в RecycleView този мой код и да ми даде изключение

публичен клас FirstFragment разширява фрагмент {

//private
String[] username = {"joe", "mido", "star", "fawzy", "mohsen"};
private RecyclerView recyclerView;
TextView textView;
ProgressDialog dialog;
FirstpageAdapter adapter;
View layout;
private final Handler myHandler = new Handler();
List<String> ids = new ArrayList<>();
private final static String TAG = "FIRST_FRAGMENT";
ListView listView;
Runnable updateRunnable;

public FirstFragment() {
    // Required empty public constructor
}

public List<String> getData() {
    List<String> data = new ArrayList<>();
    for (int i = 0; i < username.length; i++) {
        data.add(username[i]);
    }
    return data;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //new MyTask().execute();
    View layout = inflater.inflate(R.layout.fragment_first, container, false);
    recyclerView=(RecyclerView)layout.findViewById(R.id.firstList);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    PubNubService.herNow(new Callback() {
        public void successCallback(String channel, Object message) {
            try {
                JSONObject object = new JSONObject(message.toString());
                JSONArray jsonArray = object.getJSONArray("uuids");
                for (int i = 0; i < jsonArray.length(); i++) {
                    ids.add(jsonArray.getString(i));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            Log.e(TAG, ids.size() + "");
            Log.e(TAG, message.toString());

                    adapter = new FirstpageAdapter(getActivity(), ids);
            recyclerView.setAdapter(adapter);

        }

        @Override
        public void errorCallback(String s, PubnubError pubnubError) {
            Log.e(TAG, "error Callback" + pubnubError.getErrorString());
        }
    });

    return layout;
}

}

Изключение

08-01 14:16:06.903 12365-12490/com.sprintone E/AndroidRuntime﹕ ФАТАЛНО ИЗКЛЮЧЕНИЕ: Non-Subscribe-Manager-1384510668-5 Процес: com.sprintone, PID: 12365 android.view.ViewRootImpl$CalledFromWrongThreadException: Само на оригиналната нишка, която е създала йерархия на изгледи, може да докосне нейните изгледи. в android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6024) в android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:820) в android.view.View.requestLayout(View.java:16431) в android.view. View.requestLayout(View.java:16431) в android.view.View.requestLayout(View.java:16431) в android.view.View.requestLayout(View.java:16431) в android.view.View.requestLayout(View .java:16431) в android.view.View.requestLayout(View.java:16431) в android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:979) в android.view.View.requestLayout(View. java:16431) в android.view.View.requestLayout(View.java:16431) в android.view.View.requestLayout(View.java:16431) в android.view.View.requestLayout(View.java:16431) в android.support.v7.widget.RecyclerView.requestLayout(RecyclerView.java:2245) в android.support.v7.widget.RecyclerView.setAdapter(RecyclerView.java:564) в com.sprintone.userInterface.Fragment.FirstFragment$1.successCallback (FirstFragment.java:101) в com.pubnub.api.PubnubCore.invokeCallback(Неизвестен източник) в com.pubnub.api.PubnubCore.invokeCallback(Неизвестен източник) в com.pubnub.api.PubnubCore$11.handleResponse(Неизвестен източник) в com.pubnub.api.NonSubscribeWorker.process(Неизвестен източник) в com.pubnub.api.Worker.run(Неизвестен източник) в java.lang.Thread.run(Thread.java:841)


person yousef    schedule 01.08.2015    source източник


Отговори (1)


Както е посочено тук Only the original thread that created a view hierarchy can touch its views.

не можете да получите достъп до потребителския елемент извън главната нишка, опитайте да използвате AsyncTask

или RunOnUiThread

Очевидно PubNub обратните извиквания работят във фонова нишка, защото в android не можете да извършвате операция като получаване на данни от отдалечен сървър в главната нишка, за да избегнете срива на приложението при неуспешна заявка и се опитвате да получите достъп до RecucleView от pubnub обратното извикване
по-добре да получите данните в обратното извикване на pubnub и след това да ги зададете във вашия изглед извън обратното извикване

или можете да делегирате, за да получите датата от обратно извикване на pubnub, когато е готово, тук някоя полезна връзка link1
link2

person Antwan    schedule 01.08.2015
comment
така че сега можете да получите данните, върнати в postexcute и след това да ги зададете на изглед за рециклиране - person Antwan; 02.08.2015
comment
Използвах AsyncTask и зададох част PubNub CallBacks в метода doInBackground. Очевидно PubNub CallBacks работят с друга нишка и doInBackground завършват работата, преди PubNub Callbcks да завършат работата, следователно не мога да покажа резултат от PubNub CallBacks в метод на postExecute при AsyncTask, искам doInBackground Thread да завърши работата при по същото време PubNub CallBacks приключват работа - person yousef; 02.08.2015
comment
в този случай трябва да използвате делегат, за да ви каже, когато обратното извикване на pubnub завърши, тогава можете да получите данните в делегата и да ги предадете на изгледа - person Antwan; 02.08.2015
comment
можете ли да ми дадете един пример за използване на делегат в този случай? - person yousef; 02.08.2015
comment
в отговора го проверете отново - person Antwan; 02.08.2015
comment
не мога, защото имам само 11 репутация - person yousef; 02.08.2015
comment
не казах гласуване за, можете да видите връзките в отговора - person Antwan; 02.08.2015
comment
stackoverflow.com/questions/9963691/ казвате ли ми, че тази връзка обяснява вашата идея за делегат? - person yousef; 02.08.2015