2015-07-19 1 views
0

У меня была простая программа, где мне нужно обновить список и текст на основе ответа сервера ... Но Asynctask onpostexecute не обновляет представления, если экран вращается, пока выполняется doinbackground.Asynctask onpostexecute не обновляет представления, если экран вращается, а doinbackground вызывается

Я пришел, чтобы узнать причину, по которой, как деятельность заново, onpostexecute обыкновение обновлять свои взгляды (То же problem..here ссылка: Chek this link) Но я не был удовлетворен ответом, как это просто предлагая ограничения для воссоздания активности (я хочу воссоздать активность, так как в моем проекте у меня была какая-то дополнительная компоновка в ландшафтном режиме).

Пожалуйста, не предлагайте setretaininstance (true), принимая фрагменты, поскольку он не вызывает oncreateview(), что не подходит для моего проекта.

Может быть как последний раз я могу ограничить ориентацию программно в onpreexecute и отпустить его в onpostexecute. Но я думаю, что это будет не очень хорошая практика.

public class MainActivity extends ActionBarActivity { 

    TextView textView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView=(TextView) findViewById(R.id.textview); 
     if(savedInstanceState==null) 
     { 
      new myAsync().execute(); 
     } 
    } 


    public class myAsync extends AsyncTask<Void, String, Void> 
    { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      textView.setText("started"); 
      Log.e("started", "started"); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @SuppressWarnings("deprecation") 
     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 

      Log.e("executed", "executed"); 
     } 

    } 
} 

Это моя программа-образец. textview не обновляется, если экран повернут.

Просьба предложить. Заранее спасибо .

+1

Используйте 'AsyncTaskLoader' вместо' AsyncTask'. Он управляет жизненным циклом и имеет функциональность отмены/остановки. – akash93

+0

Начал работать над этим. Но документы говорят, что он поддерживается с api 11. мое приложение должно поддерживать api 9 – Avinash

+0

Его там в библиотеке поддержки. [Ссылка] (https : //developer.android.com/reference/android/support/v4/content/AsyncTaskLoader.html) – akash93

ответ

0

Вы можете предоставить myAsyncTask члену TextView с установщиком и сохранить текущую задачу в качестве статического члена.

class MyActivity extends Activity { 
    private static AsyncTask myTask = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TextView textView = (TextView) findViewById(R.id.textview); 

    if (myTask == null) { 
     new myAsync(textView).execute(); 
    } else if(myTask.getStatus() != AsyncTask.Status.FINISHED) { 
     myTask.set(textView); 
    } 
    } 

    private class myAsync extends AsyncTask<Void, String, Void> 
    { 
    TextView textView; 

    myAsync(TextView textView) { 
     this.textView = textView; 
    } 

    synchronized void setTextView(TextView textView) { 
     this.textView = textView; 
    } 

    ... 

    } 
} 

Вам все равно придется иметь дело с условиями гонки. Например. вы, вероятно, захотите внедрить механизм приостановки/возобновления своей задачи, когда действие приостанавливается/возобновляется. Вам также необходимо убедиться, что задачи textView все еще действительны и что вы очищаете статическую задачу в onPostExecute.

0

Вы можете использовать концепцию связки, чтобы вставить в нее некоторую строку. Когда активность восстанавливается после вращения, проверьте, имеет ли состояние сохраненного экземпляра значение null или нет в методе oncreate. Если не null получить строку с использованием пакета и обновить textview. Для получения дополнительной информации об этой ротации ознакомьтесь с видео с slidenerd на YouTube в плейлисте asynctask и threads. Надеюсь, поможет.

+0

Поскольку мой async еще не завершен. Я не могу сохранить это в onsavedinstance..once async завершен, тогда я могу иметь результат в onsavedinstance, так как u сказал ... – Avinash

+1

Попробуйте загрузчик slidenerd. В списке воспроизведения нитей и асинхронных задач в видеоролике №17 21, он подробно объяснил эту ротацию, используя приложение для загрузки изображений. Попробуйте, я думаю, это действительно поможет вам. –