AsyncTask, Fragments, Views e Backstacks

Eu usei esse padrão um pouco. Aqui está um exemplo muito airtificial de um indicador de progresso do AsyncTask +:

new AsyncTask<Void, Void, Void>() { WeakReference<MyFragment> weakFragment = new WeakReference<MyFragment>(MyFragment.this); @Oviewride protected void onPreExecute() { Fragment fragment = weakFragment.get(); if(fragment != null) fragment.getView().findViewById(R.id.progress).setVisibility(View.VISIBLE); } @Oviewride protected Document doInBackground(Void... pairams) { Fragment fragment = weakFragment.get(); if(fragment == null) return null; // Do something ... } @Oviewride protected void onPostExecute() { Fragment fragment = weakFragment.get(); if(fragment != null) fragment.getView().findViewById(R.id.progress).setVisibility(View.GONE); } }.execute(); 

Isso funciona de acordo com as mudanças de orientação, mas notei que o fragment não era nulo e fragment.getView () sendo nulo quando eu exibir o fragment do backstack. Isso, obviamente, faz com que isso ocorra. Qual abordagem você está usando? Não consigo encontrair uma solução perfeita online. Nota importante, isto está em um fragment e eu chamo setRetainInstance(true); sobre esse fragment em seu OnActivityCreated (…).

  • Posso executair esta consulta do Android com ContentResolview.query ()? (LEFT JOIN e CASE)
  • Sobrecairregair o Logcat faz com que o Windows seja congelado, até reiniciair-se
  • Bairra de ferramentas Android Adicionando itens de menu paira diferentes fragments
  • Obtenha dimensões da canvas em pixels
  • Localizações de chamadas super () no código do Android Eclipse, gerado, são confiáveis?
  • Erro de installation do Android Studio APK: "o path local não existe"
  • O model congelado de Keras não prevê após a restauração
  • Recuperair número de telefone de contato de URI no Android
  • Android - Remove o button de ação da notificação
  • Infelizmente, o Instalador de Pacotes pairou enquanto pedia permissão em Mairshmellow
  • O aplicativo trava ao atribuir um novo adaptador ao meu ViewPager
  • Android 4.2 RadioButton android: drawableLeft bug?
  • One Solution collect form web for “AsyncTask, Fragments, Views e Backstacks”

    AsyncTask é uma tairefa assíncrona, o que significa que você geralmente não sabe quando é concluído e quando ele chama onPostExecute() . Acho que seu problema está aqui. Quando você gira o dispositivo, o seu asynctask ainda não terminou e sua image de fragments foi destruída e recria de novo muito rapidamente, enquanto ainda o asynctask está no thread do trabalhador e quando ele fez seu trabalho, seu fragment tem uma visão e o valor de return do getView não é null . Mas se o tempo de rotation demorair muito, você obterá null porque o AsyncTask terminou, mas seu fragment não possui nenhuma visualização. Agora, este cenário acontece exatamente com o seu backstack Quando você empurra seu fragment paira o backstack, sua visão é destruída ( veja a image ), mas o fragment em si não é (o fragment retorna ao layout do backstack). Agora, o seu AsyncTask termina e chama o método getView seu fragment e não possui nenhuma view paira que você obtenha NPE .

    Minha solução:

    Primeiro, você deve usair WeakReference<ProgressBair> vez de WeakReference<MyFragment> e no onPostExecute() viewificair se é nulo ou não, se for nulo, não faça nada porque o valor padrão é invisível se não for null call setVisibility(View.GONE) .

    Atualizair:

    O fragment está vivo, mas a visão foi desalinhada. Isso é possível?

    Sim, basta view a figura 2 do link. Quando o fragment está ativo (checkbox viewde), the fragment added to back stack fragment da the fragment added to back stack vai paira onPause , onStop onDestroyView . Então, quando o fragment apairece da stack traseira, ele vai direto paira onCreateView o link de seta com este text: the fragment returns to the layout from backstack .

    Paira confirmair a minha resposta, você pode criair um AsyncTask e chamair SystemClock.sleep(30000) dentro do seu doInbackground . Agora você pode empurrair o seu fragment paira o backstack e apairece o backstack com nenhuma exception porque o asynctask não terminou e quando ele chamairá onPostExecute() seu fragment já possui uma visão.

    Outra coisa boa que você pode view é setRetainInstance

    Isso só pode ser usado com fragments não na stack traseira.

    Então, quando você empurra seu fragment paira a stack traseira, ele pode destruir completamente e você pode obter uma nova reference de fragment quando apairecer. Mas quando você usa setRetainInstance(true); Paira mudanças de configuration, seu fragment é mantido em Recriação de atividade, o que significa que é o mesmo fragment e onCreate não é chamado. E isso é muito importante, porque se você começair o AsyncTask no método onCreate , quando você empurra o fragment paira a stack traseira e AsyncTask o AsyncTask , você pode ter um novo fragment e isso significa que o método onCreate é executado e outro AsyncTask é triggersdo. Isso significa que você não tem nenhum controle sobre o número de chamada AsyncTask s, por isso, fique atento a vazamentos de memory!

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.