티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
The AsyncTask API is deprecated in Android 11. What are the alternatives?
AsyncTask API는 안드로이드 11에서 더 이상 사용되지 않습니다. 대안은 무엇인가요?
문제 내용
Google is deprecating Android AsyncTask API in Android 11 and suggesting to use java.util.concurrent
instead. you can check out the commit here
구글은 안드로이드 11에서 안드로이드 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> {
If you’re maintaining an older codebase with asynchronous tasks in Android, you’re likely going to have to change it in future. My question is that what should be proper replacement of the code snippet shown below using java.util.concurrent
. It is a static inner class of an Activity. I am looking for something that will work with minSdkVersion 16
만약 안드로이드에서 비동기 작업을 처리하는 예전 코드를 유지 보수 중이라면, 앞으로 변경해야 할 것입니다. 제가 이해한 바로는, 다음과 같은 코드 조각을 java.util.concurrent를 사용하여 적절하게 대체해야 합니다. 이 코드 조각은 Activity의 static inner class입니다. 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) ;
}
}
높은 점수를 받은 Solution
You can directly use Executors
from java.util.concurrent
package.
`java.util.concurrent` 패키지에서 `Executors`를 직접 사용할 수 있습니다.
I also searched about it and I found a solution in this Android Async API is Deprecated post.
저도 찾아보니 'Android Async API is Deprecated' 게시물에서 해결 방법을 찾았습니다.
Unfortunately, the post is using Kotlin, but after a little effort I have converted it into Java. So here is the solution.
불행하게도 해당 게시물은 코틀린을 사용하고 있지만, 약간의 노력 끝에 나는 이것을 자바로 변환할 수 있었습니다. 그래서 여기 해결책이 있습니다.
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(new Runnable() {
@Override
public void run() {
//Background work here
handler.post(new Runnable() {
@Override
public void run() {
//UI Thread work here
}
});
}
});
Pretty simple right? You can simplify it little more if you are using Java 8 in your project.
꽤 간단하지 않나요? 만약 프로젝트에서 Java 8을 사용한다면 더 간단하게 단순화할 수 있습니다.
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
//Background work here
handler.post(() -> {
//UI Thread work here
});
});
Still, it cannot defeat kotlin terms of conciseness of the code, but better than the previous java version.
여전히 코틀린의 코드 간결성에는 미치지 못하지만, 이전 자바 버전보다는 더 나은 솔루션이다.
Hope this will help you. Thank You
이것이 도움이 되기를 바랍니다. 감사합니다.
가장 최근 달린 Solution
Here I also created an Alternative for AsyncTask using abstract class and it can be just copied as a class.
여기서 AsyncTask의 대안으로 추상 클래스를 사용한 대안을 만들었습니다. 이를 클래스로 복사하여 사용할 수 있습니다.
/app/src/main/java/../AsyncTasks.java
public abstract class AsyncTasks {
private final ExecutorService executors;
public AsyncTasks() {
this.executors = Executors.newSingleThreadExecutor();
}
private void startBackground() {
onPreExecute();
executors.execute(new Runnable() {
@Override
public void run() {
doInBackground();
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
onPostExecute();
}
});
}
});
}
public void execute() {
startBackground();
}
public void shutdown() {
executors.shutdown();
}
public boolean isShutdown() {
return executors.isShutdown();
}
public abstract void onPreExecute();
public abstract void doInBackground();
public abstract void onPostExecute();
}
Implementation/ use of the above class
위 클래스의 구현/사용법
new AsyncTasks() {
@Override
public void onPreExecute() {
// before execution
}
@Override
public void doInBackground() {
// background task here
}
@Override
public void onPostExecute() {
// Ui task here
}
}.execute();
출처 : https://stackoverflow.com/questions/58767733/the-asynctask-api-is-deprecated-in-android-11-what-are-the-alternatives
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드 "elevation" 그림자 표시 문제 수정하기 (0) | 2023.02.03 |
---|---|
AppCompat에서 전체 화면 적용하기 (0) | 2023.02.02 |
Spinner에서 선택한 아이템을 위치가 String으로 찾는 방법 (0) | 2023.02.02 |
부모 액티비티에 데이터 전달하기 (0) | 2023.02.01 |
카메라로 이미지를 캡처하고 액티비티에 표시하기 (0) | 2023.02.01 |