2014-02-07 92 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定義的視圖層次,你可以創建自己的視圖類,但通常你只重用現有的。)

也就是說,不應用邏輯放到一個活動,創建特別的課程。

相關問題