在尝试使用ListFragment时,我阅读了很多关于AsyncTask的内容。现在我看到一些文章说它必须是静态的,因为技术原因。其他文章说它并不重要,因为我的情况我无法为静态做出正确的语法,所以我让我的类非静态。如果建议让它静止,请帮我改变它。
我的班级:
private class MyAsyncTask extends AsyncTask<List<String>, Void, List<String>>
{
// List of messages of the rss feed
private List<Message> messages;
private WeakReference<NieuwsSectionFragment> fragmentWeakRef;
private MyAsyncTask(NieuwsSectionFragment fragment)
{
this.fragmentWeakRef = new WeakReference<NieuwsSectionFragment>(fragment);
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
// progress.setVisibility(View.VISIBLE); //<< set here
}
@Override
protected List<String> doInBackground(List<String>... urls)
{
FeedParser parser = FeedParserFactory.getParser();
messages = parser.parse();
List<String> titles = new ArrayList<String>(messages.size());
for (Message msg : messages)
{
titles.add(msg.getTitle());
// Log.w("doInBackground", msg.getTitle());
}
return titles;
}
@Override
protected void onPostExecute(List<String> result)
{
super.onPostExecute(result);
if (result != null)
{
PostData data = null;
listData = new PostData[result.size()];
for (int i = 0; i < result.size(); i++)
{
data = new PostData();
data.postTitle = result.get(i);
listData[i] = data;
Log.w("onPostExecute", "" + listData[i].postTitle);
}
Log.w("onPostExecute", "" + adapter);
adapter = new PostItemAdapter (getActivity(), android.R.layout.simple_list_item_1, listData);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
}
当我将其设为静态时,它会在适配器上出错。它说了一些关于setListAdapter和getActivity()的内容。
答案 0 :(得分:1)
请阅读:
Is AsyncTask really conceptually flawed or am I just missing something?
非静态内部类的实例确实包含对包含类的封闭实例的引用;如果包含的类是一个活动,则在任务终止之前,活动和引用的视图都不会被释放。
OTOH,如果您传递对活动的明确引用(例如作为听众),这将不会更好。
我的建议是要记住,从 MVC (模型 - 视图 - 控制器)的观点来看,Activity是 Controller ,而async是操作很可能属于 Model ,以及必须经受更改屏幕方向等事件的数据。 ( View 是通过xml定义的视图层次结构,您可以创建自己的视图类,但通常只需重用现有的视图类。)
也就是说,不要将应用程序逻辑放入Activity中,为此创建一个特殊的类。