2015-09-06 62 views
1

嗯,我有3個滑動選項卡,並在每個選項卡中我已經在片段onCreateView()方法中調用了asynctask。它在正常情況下顯示結果,但問題是當我旋轉屏幕。基本上它會在Asynctask正在進行時以及完成任務之前強制關閉 - 我旋轉屏幕。如何取消一個asyncTask當一個滑動標籤旋轉?

所以,我試着取消onPause中的asynctask並在onCreateView()中再次調用它。以下是片段內的代碼:

public class AllFragment extends Fragment 
{ 
    SearchBusBeans searchBusObj; 
    ArrayList<SearchBusBeans> searchBusObj_arr; 

SearchingBusesAdapter myAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ ..... 
    .... 
searchBusObj_arr = new ArrayList<SearchBusBeans>(); 
    new GetSearchedBusesAsync().execute(); 
} 

@Override 
public void onPause() { 
    super.onPause(); 

    GetSearchedBusesAsync asyncObj = new GetSearchedBusesAsync(); 
    if(asyncObj.getStatus() == AsyncTask.Status.RUNNING){ 
     asyncObj.cancel(true); 
    } 
} 



private class GetSearchedBusesAsync extends AsyncTask<Void, Void, Void> 
{ 

    @Override 
    protected void onPreExecute() { super.onPreExecute(); } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     if(isCancelled()) 
      this.cancel(true); 

     if(!isCancelled()) 
     {........... 
      ......do my codes....... 
      searchBusObj = new SearchBusBeans(); 
      searchBusObj.setname(j_name); 
      searchBusObj_arr.add(searchBusObj); 
      } 
    return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result); 
     pBar.setVisibility(View.GONE); 

     myAdapter = new SearchingBusesAdapter(getActivity().getApplicationContext(), searchBusObj_arr); 
     gridView.setAdapter(myAdapter); 
    } 
    } //end of asynctask 
} //end of fragment 

現在,您可以看到我已取消onPause中的asynctask。和內doInBackground()我已經完成我的代碼在條件-if(!isCancelled())。那麼,不應該asynctask退出,而不是去onPostExecute()?

我哪裏錯了?以及如何正確執行取消和執行?

回答

0

您可以設置您的片段通過旋轉保留其狀態。這將允許您的AsyncTask繼續運行。

public class AllFragment extends Fragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

重寫片段的onCreate方法並調用setRetainInstance(true);。這使片段保持活動狀態,以便它不會被破壞,然後在配置更改期間重新創建。

+0

ggg !!這非常簡單,並且完美。謝啦! –

0

還有另一種方法來停止的AsyncTask的執行(在任何情況下,不旋轉必要):

1)保存您的AsyncTask中,當你調用一個變量.execute()

mTask = new YourAsyncTask().execute(); 

2)然後,當你需要停止任務調用.cancel()

if(mTask != null) { 
    mTask.cancel(true); 
} 

這種方法對我來說很完美,幾乎適用於任何場景。希望能幫助到你!