2013-08-30 3 views
-1

У меня есть asynctask, выполненная в onCreateView во фрагменте. Когда экран выключен и каким-то образом фрагмент должен отображаться, начинается асинтеза, но с isCancelled() - true. Я использовал PARTIAL_WAKE_LOCK, но проблема не решена. Спасибо заранее.Android AsyncTask выполняет с isCancelled() = true, когда экран выключен

Вот пример кода

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     activity = getSherlockActivity(); 
     context = activity.getApplicationContext(); 
     view = inflater.inflate(R.layout.main, container, false); 

     DownloadXMLTask = new DownloadXML(getActivity()); 
     DownloadXMLTask.execute(file); 

     return view; 
    } 

private class DownloadXML extends AsyncTask<File, Integer, String> { 

     private Activity activity; 

     public DownloadXML(Activity activity) { 
      this.activity = activity; 
     } 

     protected void onPreExecute() { 
      ... Do stuff ... 
     } 

     protected String doInBackground(File... files) { 
      // Check if the task is cancelled 
      if (isCancelled()) { return null; } 

      ... Do stuff ... 
      ... Do stuff ... 
      ... Do stuff ... 

      return null; 

     } 

     protected void onPostExecute(String result) { 
      ... Do stuff ... 
     } 

     @Override 
     protected void onCancelled() { 
      ... Do stuff ... 
     } 
    } 
+0

Вы описали, что такое поведение, но не то, что вы действительно хотите. –

+0

Спасибо за комментарий. Мне нужно выполнить задачу, как ожидается, так же, когда экран включен. Его следует отменить только тогда, когда пользователь вызывает отмену. – adamioan

+1

@adamioan: Когда «экран выключен», ваша «активность» и любые «фрагменты» больше не будут в рабочем состоянии. Если вы хотите выполнять фоновое редактирование, например, загрузки, используйте «Сервис». – Squonk

ответ

0

Если вы хотите, чтобы запустить что-то независимо от того, работает ли ваша деятельность, она должна быть в службе. Вероятно, проще всего начать с IntentService, который автоматически обрабатывает каждое намерение в фоновом потоке. Из этой деятельности сделайте намерение, которое описывает выполняемую работу, и startService ваши услуги, используя это намерение. Дайте вашему намерению onHandleIntent код, который в настоящее время находится в вашем doInBackground. Вы можете вернуть результат к активности в широковещательной передаче или через какой-либо другой механизм, например, путем обновления ContentProvider.

+0

Спасибо за ответ. Мне удалось решить эту проблему, добавив код выполнения асинхронизации в ** onResume ** скорее ** onCreateView **. При первом запуске кода будет отменен, но когда пользователь включит экран, ** onResume ** повторно выполнит задачу async. – adamioan

Смежные вопросы