我有一个自定义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获取数据时的任何其他时间调用?
答案 0 :(得分:5)
我可以从onPostExecute函数调用notifyDataSetChanged()吗? AsyncTask
是的,当notifyDataSetChanged()
执行完成时,您可以从onPostExecute
调用doInBackground
来更新适配器数据。这样做:
@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();
}
}
答案 1 :(得分:2)
将notifyDataSetChanged()
中的onPostExecute()
称为
@Override
protected void onPostExecute(ArrayList<String> stringsArray) {
//add the tours from internet to the array
if(stringsArray != null) {
mStrings.addAll(toursArray);
MyListAdapter.this.notifyDataSetChanged();
}
}
答案 2 :(得分:1)
您是否尝试在onPostExecute
的{{1}}方法中调用它。 ASyncTask
和onPreExecute
用于更新用户界面。