2014-06-17 88 views
5

這是我最近遇到的問題。有時在我使用home按鈕退出應用程序並讓它在後臺閒置一段時間後,getActivity()會得到空指針。所以我只是想知道我是否設置了異步任務,聽衆是否錯誤,或者問題可能在別處。我的一般過程如下:片段,AsyncTask和聽衆

public class MyAsyncTask extends AsyncTask<Void, Void, List<SomeObject>>{ 

    private Context ctx; 
    private AsyncListener listener; 

    public MyAsyncTask(Context ctx){ 
    //set Context, etc 
    } 

... 
    onPostExecute(List<SomeObject> result){ 
     super.onPostExecute(result); 
     if(result!=null){ 
      listener.onAvailable(result); 
     } else { 
      listener.onUnavailable(); 
     } 
    } 

    public interface AsyncListener{ 
     void onAvailable(List<SomeObject> result); 
     void onUnavailable(); 
    } 

    public void setAsyncListener(AsyncListener listener){ 
     this.listener = listener; 
    } 
} 

片段:

public class MyFragment extends Fragment implements AsyncListener { 

    private AsyncTask task; 
    private List<SomeObject> data; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     return inflater.inflate(R.layout.fragment_messages, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 

     setViews(); 
     if(data == null) { 
      task = new AsyncTask(getActivity()); 
      task.setAsyncListener(this); 
      task.execute(); 
     } else { 
      setData(); 
     } 
    } 

    private void setData(){ 
     someListView.setAdapter(new SomeAdapter(getActivity(), data)); 
    } 

    @Override 
    public void onAvailable(List<SomeObject> result){ 
     this.data = result; 
     setData(); 
    } 

    @Override 
    public void onUnavailable(List<SomeObject> result){ 
     //Create toast or alert dialog, etc 
    } 

} 

正如你所看到的,我使用監聽器從發佈的AsyncTask結果我的片段。問題是,在設置適配器時,我有時會在getActivity()上收到空指針。這隻會在我退出應用程序時發生,讓它在後臺長時間放置然後打開它。也許監聽者在連接Fragment之前被觸發?也許我需要以不同的方式設定自己的邏輯?

回答

1

問題就出在這一段代碼

private void setData(){ 
    someListView.setAdapter(new SomeAdapter(getActivity(), data)); 
} 

當您關閉它可能在背景中死去的活動。當Asynctask完成並且從監聽器調用SetData函數時,getActivity()會因操作系統已銷燬它而爲null。在設置適配器之前檢查getActivity()是否爲null。

+0

我可以嘗試,它可能會停止應用程序崩潰,但我想也許我應該設置我的偵聽器在片段的不同生命週期,而不是onActivityCreated()? –

+0

這是很有可能的,因爲它在創建它時發現活動,因此正在正確註冊偵聽器。它只有在未來的不確定時間完成異步任務時,它纔會發現它期望發現發生此錯誤的活動。所以我認爲這是與異步操作風格的本質相關的東西,而不是其他任何東西。 – Vishal