2014-02-07 59 views
1

我在阅读了很多关于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()的一些东西。

+0

是asynctask活动的内部类吗? – Raghunandan

+0

不,它是ListFragment的内部类 – Shishi

+0

http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html。向下滚动并检查点,并阅读http://stackoverflow.com/questions/3106912/why-does-android-prefer-static-classes – Raghunandan

回答

1

请看:

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

非静态内部类的实例确实包含对含有类的外围实例的引用;如果包含类是一个活动,则活动和参考视图都不能在任务死亡之前释放。

OTOH,如果你传递一个活动的明确引用(例如作为一个监听器),这将不会更好。

我的建议是要记住,从MVC模型 - 视图 - 控制器)观点的活动是控制器,而异步操作是最有可能属于型号,与沿数据必须在诸如改变屏幕方向之类的事件中生存。 (和查看是通过XML定义的视图层次,你可以创建自己的视图类,但通常你只重用现有的。)

也就是说,不应用逻辑放到一个活动,创建特别的课程。

相关问题