편집 :이 질문은 중복되지 않습니다
- 며칠 전 지원 중단에 대한 AOSP 커밋이 완료되었습니다.
- 다른 질문은 AsyncTask보다 AsyncTaskLoader를 사용하는 것입니다.
Google은 Android 11에서 Android AsyncTask API를 더 이상 사용하지 않으며 java.util.concurrent
대신 사용할 것을 제안합니다 . 여기서 커밋을 확인할 수 있습니다
*
* @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> {
Android에서 비동기 작업으로 오래된 코드베이스를 유지 관리하는 경우 나중에 변경해야 할 것입니다. 내 질문은를 사용하여 아래에 표시된 코드 스 니펫을 올바르게 대체해야한다는 것 java.util.concurrent
입니다. 활동의 정적 내부 클래스입니다. 나는 함께 작동하는 것을 찾고 있습니다minSdkVersion 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) ;
}
}
답변
private WeakReference<MyActivity> activityReference;
적절한 해법이 아니고 항상 해킹 이었기 때문에WeakReference<Context>
더 이상 사용되지 않는다는 좋은 의견 .
이제 사람들은 코드를 살균 할 수있는 기회를 갖게 될 것입니다.
AsyncTask<String, Void, MyPojo>
이 코드를 기반으로 Progress
실제로 필요하지 않으며 String
입력 + MyPojo
출력이 있습니다.
실제로 AsyncTask를 사용하지 않고도 쉽게 달성 할 수 있습니다.
public class TaskRunner {
private final Executor executor = Executors.newSingleThreadExecutor(); // change according to your requirements
private final Handler handler = new Handler(Looper.getMainLooper());
public interface Callback<R> {
void onComplete(R result);
}
public <R> void executeAsync(Callable<R> callable, Callback<R> callback) {
executor.execute(() -> {
final R result = callable.call();
handler.post(() -> {
callback.onComplete(result);
});
});
}
}
문자열을 전달하는 방법? 이렇게 :
class LongRunningTask implements Callable<MyPojo> {
private final String input;
public LongRunningTask(String input) {
this.input = input;
}
@Override
public MyPojo call() {
// Some long running task
return myPojo;
}
}
과
// in ViewModel
taskRunner.executeAsync(new LongRunningTask(input), (data) -> {
// MyActivity activity = activityReference.get();
// activity.progressBar.setVisibility(View.GONE);
// populateData(activity, data) ;
loadingLiveData.setValue(false);
dataLiveData.setValue(data);
});
// in Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
viewModel.loadingLiveData.observe(this, (loading) -> {
if(loading) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
});
viewModel.dataLiveData.observe(this, (data) -> {
populateData(data);
});
}
이 예에서는 DB 쓰기 (또는 직렬화 된 네트워크 요청)에 적합한 단일 스레드 풀을 사용했지만 DB 읽기 또는 여러 요청에 대해 원하는 경우 다음 Executor 구성을 고려할 수 있습니다.
private static final Executor THREAD_POOL_EXECUTOR =
new ThreadPoolExecutor(5, 128, 1,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
답변
Java의 동시성 프레임 워크 또는 Kotlin Coroutines를 사용하는 것이 좋습니다. 그러나 Rxjava는 훨씬 더 많은 유연성과 기능을 갖기 때문에 Java 동시성은 매우 인기를 얻었습니다.