如何在另一个线程上的回调内的ArrayAdapter中notifyDataSetChanged? - Android

时间:2016-03-21 15:17:34

标签: java android multithreading

我正在进行网络呼叫,然后一旦网络呼叫完成检索信息,我想调用notifyDataSetChanged。如果它都在同一个线程上,那么这是有效的,但如果更新发生在另一个线程中,我将如何更新列表呢?

**

会抛出此错误:

android.view.ViewRootImpl$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views.

2 个答案:

答案 0 :(得分:1)

您可以使用AsyncTask在单独的线程上执行网络操作。您从UI线程启动AsyncTask,任务本身将在一个单独的线程上运行。当AsyncTask完成后,AsyncTask的onPostExecute方法将再次在UI线程上运行,您可以从中调用notifyDataSetChanged()方法。

Here's some useful info on AsyncTask in the Android developer docs

答案 1 :(得分:1)

你应该使用一个处理程序。 声明你的适配器就像类的一个属性(在任何方法之外)。 并在您的活动中使用此代码:

public Handler updateAdapter = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg)
    {
        //Update code
    }
});

你线程中的这个(调用处理程序):

updateCode.sendEmptyMessage(0);