EDIT : Esta pergunta não é uma duplicata como
- Apenas alguns dias atrás, o comprometimento do AOSP com a depreciação foi feito.
- A outra pergunta é sobre o uso do AsyncTaskLoader sobre o AsyncTask.
O Google está preterindo a API do AsyncTask do Android no Android 11 e sugerindo o uso java.util.concurrent
. você pode conferir o commit aqui
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Se você estiver mantendo uma base de código mais antiga com tarefas assíncronas no Android, provavelmente precisará alterá-la no futuro. Minha pergunta é: o que deve ser a substituição adequada do snippet de código mostrado abaixo usando java.util.concurrent
. É uma classe interna estática de uma atividade. Estou à procura de algo que funcione comminSdkVersion 16
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
private WeakReference<MyActivity> activityReference;
LongRunningTask(MyActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected MyPojo doInBackground(String... params) {
// Some long running task
}
@Override
protected void onPostExecute(MyPojo data) {
MyActivity activity = activityReference.get();
activity.progressBar.setVisibility(View.GONE);
populateData(activity, data) ;
}
}
AsyncTask
não pode ser removido sem quebrar a compatibilidade com versões anteriores.Respostas:
Boa indicação de que está obsoleta, porque o
WeakReference<Context>
sempre foi um hack e não uma solução adequada .Agora as pessoas terão a oportunidade de higienizar seu código.
Com base nesse código,
Progress
na verdade não é necessário e existe umaString
entrada +MyPojo
saída.Isso é realmente muito fácil de realizar sem qualquer uso do AsyncTask.
Como passar na String? Igual a:
E
Este exemplo usou um pool de thread único que é bom para gravações de banco de dados (ou solicitações de rede serializadas), mas se você deseja algo para leituras de banco de dados ou várias solicitações, considere a seguinte configuração de Executor:
fonte
executor.post
. Não é possível resolver métodoexecute()
em vez depost()
Context
isso? Eu sei que passarContext
paraAsyncTask
um era um dos seus problemas.newSingleThreadExecutor
é melhor para gravações, mas você definitivamente deve usar oTHREAD_POOL_EXECUTOR
no final da postagem para leituras do banco de dados.O Google recomenda o uso da estrutura de concorrência em Java ou da Kotlin Coroutines. mas o Rxjava acaba tendo muito mais flexibilidade e recursos do que a concorrência java, então ganhou bastante popularidade.
fonte