【问题标题】:android - Update ListView from AsyncTask doInBackground() threadandroid - 从 AsyncTask doInBackground() 线程更新 ListView
【发布时间】:2014-03-14 13:56:15
【问题描述】:

我有一个线程做一些图像处理工作正常,但在整个执行过程中,我希望它定期向 ListView 发送字符串以更新用户的进度,我正在使用 publishProgress() 来显示字符串,但是我无法让它动态更新,只有在后台任务完成后才显示所有内容。

后台线程:

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    String message = "";
        for (String str : values) {
    message = str;
    }
    publishProgress.addItem(message); // Calls method in publishProgress.class with the update string.
}

发布进度类:

// Imports
public class publishProgress extends Activity 
{
public static ArrayAdapter<String> ad;
public static ArrayList <String> updates = new ArrayList <String>();
public static ListView list;
}
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    setContentView(R.layout.activity_publishProgress);

    ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, updates);
    list = (ListView)findViewById(R.id.listView1);
    list.setAdapter(ad);
}

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public static void addItem(String text) {
    updates.add(text);
    ad.notifyDataSetChanged();
}

问题是我在调用 ad.NotifyDataSetChanged(); 时得到一个 nullPointerException;

我没有太多的 android 经验,所以如果有人知道如何在不冻结 GUI 的情况下动态地将字符串添加到 ListView 中,我将不胜感激。

  • 如果有人确实找到了解决方案,您可以尝试解释一下,以便我下次理解,谢谢!

【问题讨论】:

    标签: java android listview android-listview android-asynctask


    【解决方案1】:

    doInBackgroud() 函数上执行依赖于网络调用的操作,所有依赖于 UI 的函数都在 onPostExecute() 函数上实现它们,因为在这里你回到了 UI 线程。所以将notifyDataSetChanged() 转为onPostExecute()

    【讨论】:

    • 谢谢! - 它在没有来自 onPostExecute() 的 nullPointerException 的情况下调用,灵感来自我尝试从 onPostUpdate() 调用它并且成功了!
    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多