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

标签 android android-fragments android-asynctask android-viewpager android-fragmentactivity

我在 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/

相关文章:

java - 在 Android studio 中使用 Activity 模板时无法添加新的 Java 类吗?

java - 二进制 XML 文件行 # : Error inflating class <unknown> using an ArrayAdapter and AsyncTask

java - Android 应用程序因 Fragment 中的 OnClickListener 崩溃

android - 如何通过焦点调整屏幕中两个 fragment 的大小?

java - 使用 AsyncTask 时应用程序崩溃

java - Android:如何像现在这样快速执行这个for循环?

java - 如何将图标(如搜索、心形、选项)添加到 Android 卡片 View 的顶部,如图所示?

java - 无法将数据插入 fragment 内的数据库

android - 为什么 AsyncTask 的 execute() 必须在 UI 线程上调用,即使 AsyncTask 在 internalHandler 中使用了 Looper.getMainLooper()?

java - ProgressDialog 未显示在 onPreExecute() 中