在recycleView android中显示来自hereNow Pubnub的结果数据

在recycleView android中显示来自hereNow Pubnub的结果数据,android,android-recyclerview,pubnub,Android,Android Recyclerview,Pubnub,我在开始活动时调用此方法。我希望它显示在RecycleView中 这是我的代码,并给我例外 公共类FirstFragment扩展了Fragment{ //private String[] username = {"joe", "mido", "star", "fawzy", "mohsen"}; private RecyclerView recyclerView; TextView textView; ProgressDialog dialog; FirstpageAdapter adapter

我在开始活动时调用此方法。我希望它显示在RecycleView中 这是我的代码,并给我例外

公共类FirstFragment扩展了Fragment{

//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;
}
//私有
String[]用户名={“joe”、“mido”、“star”、“fawzy”、“mohsen”};
私人回收站;
文本视图文本视图;
进程对话;
第一页适配器;
视图布局;
私有最终处理程序myHandler=新处理程序();
列表ID=新的ArrayList();
私有最终静态字符串TAG=“FIRST_FRAGMENT”;
列表视图列表视图;
可运行的updateRunnable;
公共第一片段(){
//必需的空公共构造函数
}
公共列表getData(){
列表数据=新的ArrayList();
对于(int i=0;i
}

例外情况

08-01 14:16:06.903 12365-12490/com.sprintone E/AndroidRuntime﹕ 致命异常:Non-Subscribe-Manager-1384510668-5 进程:com.sprintone,PID:12365 android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。 在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.nonsubscribeeworker.process(未知源) 位于com.pubnub.api.Worker.run(未知源)
在java.lang.Thread.run(Thread.java:841)

中,如这里所述
只有创建视图层次结构的原始线程才能接触其视图。

您无法从主线程外部访问ui元素,请尝试使用

显然,PubNub回调是在后台线程上工作的,因为在android中,您无法在主线程上执行诸如从远程服务器获取数据之类的操作,以避免请求失败导致应用程序崩溃,并且您尝试从PubNub回调访问
RecucleView
最好在pubnub回调中获取数据,然后在回调外部的视图中设置它

或者,您也可以在pubnub回调就绪时从中获取日期 这里有一些有用的链接

因此,现在您可以获取PostExecute中返回的数据,然后将其设置为回收视图。我使用AsyncTask并在方法doInBackground中设置部分PubNub回调。显然,PubNub回调在PubNub回调完成工作之前工作另一个线程和doInBackground完成工作,因此我无法在上的方法中显示PubNub回调的结果postExecute at AsyncTask我想在后台线程同时完成工作PubNub回调完成工作在这种情况下,您应该使用delegate来告诉您PubNub回调何时完成,然后您可以获取委托中的数据并将其传递给视图您能给我一个在这种情况下使用delegate的示例吗?在回答中检查它再一次