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之前被觸發?也許我需要以不同的方式設定自己的邏輯?
我可以嘗試,它可能會停止應用程序崩潰,但我想也許我應該設置我的偵聽器在片段的不同生命週期,而不是onActivityCreated()? –
這是很有可能的,因爲它在創建它時發現活動,因此正在正確註冊偵聽器。它只有在未來的不確定時間完成異步任務時,它纔會發現它期望發現發生此錯誤的活動。所以我認爲這是與異步操作風格的本質相關的東西,而不是其他任何東西。 – Vishal