在Android中通信UI线程不使用View.post?

时间:2014-06-20 02:01:47

标签: android android-activity android-asynctask android-handler

关于您可以轻松使用View.post的视图,我有一个问题但是示例 在像adapter.notifyDataSetChanged()这样的适配器中你怎么能使用view.post,

示例即时更新我的​​列表视图,这是使用此代码的更佳实践

mAdapter = new HomePageAdapter(this, list);
mListView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();

这种风格是最佳做法:

runOnUiThread

 mAdapter = new HomePageAdapter(this, list);

HomePage.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mListView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
    }
});

的AsyncTask

class updates extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... arg0) {
            mAdapter = new HomePageAdapter(HomePage.this, defaultListVal);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            mListView.setAdapter(mAdapter);
            mAdapter.notifyDataSetChanged();
        }
    }

处理程序

handler = new Handler() {
    public void handleMessage(Message msg) {
          mListView.setAdapter(mAdapter);
          mAdapter.notifyDataSetChanged();
    }
 };

class update implements Runnable {
    @Override
    public void run() {
        mAdapter = new HomePageAdapter(HomePage.this, defaultListVal);

        handler.sendEmptyMessage(0);
    }
}

1 个答案:

答案 0 :(得分:1)

每个人都有不同的功能:

Which of this style is best practice:

<强> runOnUiThread

只有当你在不同的线程上时才使用它,因为创建此视图的线程只能调用/更新该视​​图,如果你在不调用其父线程的情况下在另一个线程上更新它,那么你将得到一个{ {1}}

<强>的AsyncTask

当您进行网络连接,在CPU上进行繁重操作等会阻塞主线程时使用此功能。

<强>处理程序

与它将调用主线程的CalledFromWrongThreadException相同,runOnUiThread总是由其父线程调用,在那里实例化它。