2015-09-06 60 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); 
} 

这种方法对我来说很完美,几乎适用于任何场景。希望能帮助到你!