gpt4 book ai didi

android - AsyncTask 在 ViewPager 的每个页面上运行

转载 作者:可可西里 更新时间:2023-11-01 19:07:05 24 4
gpt4 key购买 nike

我在 android development tutorial 中有 3 个标签

现在我想做的很简单,我在每个页面上使用 Fragments。我想在每个页面上显示来自 rss 提要的不同内容。

问题是当我转到下一个选项卡时,它运行前一个 fragment 的 AsyncTask(位于 onCreateView 中)。

因此,您从第 1 页开始,它可以很好地加载内容。然后,当您转到第 2 页时,将再次运行第 1 页 fragment 的 onCreateView。并且显然给出了 NullException。关键是它不应该在第 2 页运行第 1 页的 AsyncTask。

我认为不需要任何示例代码,如果需要请告诉我您需要查看哪一部分。然后我将编辑我的问题。

ListFragment 中的 AsyncTask:

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();
}

LogCat: logcat

最佳答案

尝试在 onPostExecute() 之前使用 isAdded()isAdded() 如果该 fragment 当前已添加到其 Activity 中,则返回 true。

http://developer.android.com/reference/android/app/Fragment.html#isAdded()

@Override
protected void postExecute(){
if(isAdded()){
//perform Display Changes
}
}

关于android - AsyncTask 在 ViewPager 的每个页面上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21671875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com