我有3个标签,如android development tutorial
现在我想做的是非常简单,我在每一页上使用片段。我想在每个页面上显示来自rss提要的不同内容。
问题是当我转到下一个选项卡时,它运行前一个片段的asynctask(位于oncreateview中)。
所以从第1页开始,它可以很好地加载内容。然后,当您转到第2页时,将再次运行第1页片段的oncreateview。显然给出了一个空异常。关键是它不应该在第2页上运行第1页的asynctask。
我不认为需要任何示例代码,如果需要的话,请告诉我您需要查看哪个部分。然后我将编辑我的问题。
ListFragment中的异步任务:
public class MyAsyncTask extends AsyncTask<List<String>, Void, List<String>>
{
// List of messages of the rss feed
private List<Message> messages;
private volatile boolean running = true;
@SuppressWarnings("unused")
private WeakReference<NieuwsSectionFragment> fragmentWeakRef;
private MyAsyncTask(NieuwsSectionFragment fragment)
{
this.fragmentWeakRef = new WeakReference<NieuwsSectionFragment>(fragment);
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
mProgress.show();
// progress.setVisibility(View.VISIBLE); //<< set here
}
@Override
protected void onCancelled()
{
Log.w("onCancelled", "now cancelled");
running = false;
}
@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);
mProgress.dismiss();
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);
data.postThumbUrl = "http://igo.nl/foto/app_thumb/28991-Taxi-vast-na-poging-tot-nemen-van-sluiproute.jpg";
listData[i] = data;
Log.w("onPostExecute", "" + listData[i].postTitle);
}
adapter = new PostItemAdapter (getActivity(), android.R.layout.simple_list_item_1, listData);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
}
它在方法内部调用,该方法在ListFragment的OnCreateView中执行:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
startNewAsyncTask();
View rootView = inflater.inflate(R.layout.fragment_section_nieuws, container, false);
return rootView;
}
@SuppressWarnings("unchecked")
public void startNewAsyncTask()
{
MyAsyncTask asyncTask = new MyAsyncTask(this);
this.asyncTaskWeakRef = new WeakReference<MyAsyncTask>(asyncTask);
asyncTask.execute();
}
日志:
最佳答案
尝试在isAdded()
之前使用onPostExecute()
。isAdded()
如果片段当前已添加到其活动中,则返回true。
http://developer.android.com/reference/android/app/Fragment.html#isAdded()
@Override
protected void postExecute(){
if(isAdded()){
//perform Display Changes
}
}