Android 从 AsyncTask 调用 notifyDataSetChanged
Posted
技术标签:
【中文标题】Android 从 AsyncTask 调用 notifyDataSetChanged【英文标题】:Android call notifyDataSetChanged from AsyncTask 【发布时间】:2013-05-02 17:17:08 【问题描述】:我有一个自定义 ListAdapter,它在 AsyncTask 中从 Internet 获取数据。
数据已完美添加到列表中,但是当我尝试执行操作时应用程序崩溃...
我确定这是因为我正在调用 notifyDataSetChanged();在错误的时间(即在 AsyncTask 结束之前)。
我现在得到了什么:
public class MyListAdapter extends BaseAdapter
private ArrayList<String> mStrings = new ArrayList<String>();
public MyListAdapter()
new RetreiveStringsTask().execute(internet_url);
//here I call the notify function ****************
this.notifyDataSetChanged();
class RetreiveStringsTask extends AsyncTask<String, Void, ArrayList<String>>
private Exception exception;
@Override
protected ArrayList<String> doInBackground(String... urls)
try
URL url= new URL(urls[0]);
//return arraylist
return getStringsFromInternet(url);;
catch (Exception e)
this.exception = e;
Log.e("AsyncTask", exception.toString());
return null;
@Override
protected void onPostExecute(ArrayList<String> stringsArray)
//add the tours from internet to the array
if(stringsArray != null)
mStrings.addAll(toursArray);
我的问题是:我可以从 AsyncTask 中的 onPostExecute 函数调用 notifyDataSetChanged() 还是在 AsyncTask 获取数据的任何其他时间调用?
【问题讨论】:
【参考方案1】:我可以从 onPostExecute 函数调用 notifyDataSetChanged() 异步任务
是的,当doInBackground
执行完成时,您可以从onPostExecute
调用notifyDataSetChanged()
来更新适配器数据。这样做:
@Override
protected void onPostExecute(ArrayList<String> stringsArray)
//add the tours from internet to the array
if(stringsArray != null)
mStrings.addAll(toursArray);
// call notifyDataSetChanged() here...
MyListAdapter.this.notifyDataSetChanged();
【讨论】:
这会清除列表并从头开始加载吗?这听起来不是很没有效率吗?我问是因为面临两难境地,我是否应该在自己的应用程序中使用类似的解决方案。【参考方案2】:在onPostExecute()
中调用notifyDataSetChanged()
@Override
protected void onPostExecute(ArrayList<String> stringsArray)
//add the tours from internet to the array
if(stringsArray != null)
mStrings.addAll(toursArray);
MyListAdapter.this.notifyDataSetChanged();
【讨论】:
【参考方案3】:您是否尝试过在ASyncTask
的onPostExecute
方法中调用它。 onPreExecute
和 onPostExecute
用于更新 UI。
【讨论】:
以上是关于Android 从 AsyncTask 调用 notifyDataSetChanged的主要内容,如果未能解决你的问题,请参考以下文章
从 asyncTask doInBackground 调用 Activity
如何从android中的自定义适配器调用Activity asynctask
Android PushNotification IntentService 并调用 AsyncTask 函数从服务器数据库获取数据并更新 sqlite 数据库