【问题标题】:show resulting data from hereNow Pubnub in recycleView android在recyclerView android中显示来自hereNow Pubnub的结果数据
【发布时间】:2015-08-01 08:50:58
【问题描述】:

我在启动 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)

【问题讨论】:

    标签: android android-recyclerview pubnub


    【解决方案1】:

    如此处所述Only the original thread that created a view hierarchy can touch its views.

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

    RunOnUiThread

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

    或者您可以委托从 pubnub 回调中获取日期,当它准备好时 这里有一些有用的链接 link1
    link2

    【讨论】:

    • 所以现在你可以在 postexcute 中获取返回的数据,然后将其设置为回收视图
    • 我使用了 AsyncTask 并在方法 doInBackground 中设置了部分 PubNub CallBacks。显然 PubNub CallBacks 工作另一个线程,并且 doInBackground 在 PubNub Callbcks 完成工作之前完成工作,因此我无法在 postExecute 的方法中显示 PubNub CallBacks 的结果AsyncTask 我希望 doInBackground 线程同时完成工作 PubNub CallBacks 完成工作
    • 在这种情况下,您应该使用委托来告诉您 pubnub 回调何时完成,然后您可以获取委托中的数据并将其传递给视图
    • 你能给我举一个在这种情况下使用委托的例子吗?
    • 在答案中再检查一遍
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多