当我想创建一个新线程时该使用什么方法>运行DB任务>返回结果>如果DB任务成功,运行另一个任务>然后返回到主线程更新UI使用收到的结果?
我知道Kotlin coroutine
是Kotlin中的解决方案,但是如何在Java中实现这一点,并且在著名的AsyncTask
被弃用之后?
+ +我使用线程文档的一些信息,但代码是复杂的理解,可以有一个简单的代码来实现上述用例提到的其他人的未来参考?
试试这个
class MyActivity extends AppCompatActivity {
private HandlerThread dbHandlerThread = null;
private Handler dbHandler = null;
@Override
public void onCreate(Bundle savedInstanceState) {
dbHandlerThread = new HandlerThread("db-thread");
dbHandlerThread.start();
dbHandler = new Handler(dbHandlerThread.getLooper());
doSomeDbStatement();
}
@Override
public void onDestroy() {
if (dbHandlerThread != null) {
dbHandlerThread.quitSafely();
}
}
private void bringResultHere(List<Data> result) {
// do something here
}
private void doSomeDbStatement() {
dbHandler.post(() -> {
final List<Data> result = doFetchDataFromDb();
MyActivity.this.runOnUiThread(() -> bringResultHere(result));
});
}
}
最好的方法是使用RxJava和RxAndroid
在你实现它的库之后,你可以使用single
为1排放和Observable
为多个排放
。
private Single<returnType> getSomthing() {
return Single.create(emitter -> {
//write the DB call you want ot make in background
emitter.onSuccess(varToReturnOnSuccess);
});
}
a single将只返回您使用emitter.onSuccess
发送的一个数据,并且您将在订阅中获得它,如:
.subscribe(returnedVar -> {
//use it here
});
最终调用将像:
getSomthing()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(returnedVar -> /*use the returned var here*/ , throwable -> throwable.printStackTrace());
getSomthing()
,returnedVar
,returnType
,varToReturnOnSuccess
为名称,仅作说明,可作相应修改