[Android] AsyncTask 在Android 11開始deprecate,解法: 使用 Executors 替代
前言:
長期以來(Android 11),都使用AsyncTask來進行backend與frontend 溝通資料並更新UI。
也應該開始用新的方法來取代舊方式了(使用 Executors 替代AsyncTask)。
解法 & 範例:
JAVA程式碼如下:
public class TestActivity extends AppCompatActivity {
private ExecutorService executorService;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
executorService = Executors.newFixedThreadPool(1);
doAsyncCode();
}
private void doAsyncCode() {
executorService.submit(new Runnable() {
@Override
public void run() {
// 执行你的耗时操作代码
...
doOnUiCode();
}
});
}
private void doOnUiCode() {
Handler uiThread = new Handler(Looper.getMainLooper());
uiThread.post(new Runnable() {
@Override
public void run() {
// 更新你的UI
}
});
}
@Override
protected void onStop() {
super.onStop();
if (!executorService.isShutdown()) {
executorService.shutdownNow();
}
}
}
Kotlin 如下:
導入LIB:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
Kotlin程式碼如下:
class MainActivity : AppCompatActivity() {
val errorHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
// 发生异常时的捕获
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
GlobalScope.launch(errorHandler) {
withContext(Dispatchers.IO) {
// 执行你的耗时操作代码
...
doOnUiCode()
}
}
}
private suspend fun doOnUiCode() {
withContext(Dispatchers.Main) {
// 更新你的UI
}
}
}
參考:
https://www.jianshu.com/p/ba309c0cf533
留言
張貼留言