AsyncTask应该是静态的还是无关紧要的?

时间:2014-02-07 09:26:25

标签: android android-asynctask

在尝试使用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()的内容。

1 个答案:

答案 0 :(得分:1)

请阅读:

Is AsyncTask really conceptually flawed or am I just missing something?

非静态内部类的实例确实包含对包含类的封闭实例的引用;如果包含的类是一个活动,则在任务终止之前,活动和引用的视图都不会被释放。

OTOH,如果您传递对活动的明确引用(例如作为听众),这将不会更好。

我的建议是要记住,从 MVC 模型 - 视图 - 控制器)的观点来看,Activity是 Controller ,而async是操作很可能属于 Model ,以及必须经受更改屏幕方向等事件的数据。 ( View 是通过xml定义的视图层次结构,您可以创建自己的视图类,但通常只需重用现有的视图类。)

也就是说,不要将应用程序逻辑放入Activity中,为此创建一个特殊的类。