android - 在将值插入数据库时,工作管理器无法处理后台线程
问题描述
我尝试通过改造获取数据,然后使用响应主体尝试使用 Work Manager 将列插入房间数据库。但它仍然在主线程异常上给出错误网络,即使 doWork() 方法在后台线程上工作。请帮助我解决引入异步任务以外的解决方案,因为如果引入异步任务,那么我的 WorkManagers 默认方法,如 beginWith() ,then() 将开始并行工作,而不是按顺序工作。
BillTaxInfoDAO billTaxInfoDAO=db.billTaxInfoDao(); billTaxInfoDAO.insert(billTaxInfo); 这两行在主线程异常上给出网络。
错误:无法访问主线程上的数据库,因为它可能会长时间锁定 UI。在 androidx.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:209) 在 androidx.room.RoomDatabase.beginTransaction(RoomDatabase.java:256) 在 com.witbybit.offlinepos.datamodels.pointofsale.BillTaxInfoDAO_Impl.insert(BillTaxInfoDAO_Impl.java:103 ) 在 com.witbybit.offlinepos.restore.RestoreManager$4.onResponse(RestoreManager.java:196)
我的工人阶级
@NonNull
@Override
public Result doWork() {
try {
Data data = getInputData();
String choice = data.getString("method");
switch (choice) {
case "back_up_found":{isBackUpfound();break;}
case "bill_tax_info": {billTaxInfoRestore();break;}
case "category": {categoryRestore();break;}
case "customer": {customerRestore();break;}
case "outlet": {outletRestore();break;}
case "payment_entry": {paymentEntryRestore();break;}
case "pos_bill": {posBillRestore();break;}
case "pos_bill_item": {posBillItemRestore();break;}
case "pos_item": {posItemRestore();break;}
case "tax": {taxRestore();break;}
case "tax_group": {taxGroupRestore();break;}
case "user": {userRestore();break;}
case "user_sms_data": {userSMSData();break;}
default: {Log.wtf(TAG, "default called");}
}
return Result.success(data);
}catch (Exception e){
Log.wtf(TAG,"Failed for "+e.getMessage() );
return Result.failure();
}
}
public void isBackUpfound(){
RestoreApiClient restoreApiClient=getRetrofit().create(RestoreApiClient.class);
Call<List<Object>> call=restoreApiClient.isBackUpFound();
call.enqueue(new Callback<List<Object>>() {
@Override
public void onResponse(Call<List<Object>> call, Response<List<Object>> response) {
for(Object object:response.body()){
HashMap<String,Double> map=new Gson().fromJson(new Gson().toJson(object),HashMap.class);
double row_count=map.get("row");
if(row_count>1){
Log.wtf("Restore Manager" ,"Backup Found");
}
}
}
@Override
public void onFailure(Call<List<Object>> call, Throwable t) {
}
});
}
private void billTaxInfoRestore(){
RestoreApiClient apiClient=RestoreManager.getRetrofit().create(RestoreApiClient.class);
Call<List<Object>> call=apiClient.getEachTableData("bill_tax_info");
call.enqueue(new Callback<List<Object>>() {
@Override
public void onResponse(Call<List<Object>> call, Response<List<Object>> response) {
for (Object object: response.body()) {
Gson gson=new Gson();
BillTaxInfo billTaxInfo=gson.fromJson(gson.toJson(object),BillTaxInfo.class);
//BillsRepository.billTaxInfoInsert(billTaxInfo,getApplicationContext());
AppDatabase db = AppDatabase.getDatabase(getApplicationContext());
BillTaxInfoDAO billTaxInfoDAO=db.billTaxInfoDao();
billTaxInfoDAO.insert(billTaxInfo);
}
Log.wtf(TAG,"bills restore complete");
}
@Override
public void onFailure(Call<List<Object>> call, Throwable t) {
Log.wtf("Restore Manager","failure "+t);
}
});
}
这是我的调用片段类
var tax_bill_info_request=OneTimeWorkRequest.Builder(RestoreManager::class.java!!)
.setInputData(Data.Builder().putString("method", "bill_tax_info").build())
.build()
var category_request=OneTimeWorkRequest.Builder(RestoreManager::class.java!!)
.setInputData(Data.Builder().putString("method", "category").build())
.build()
requests.add(tax_bill_info_request)
requests.add(category_request)
WorkManager.getInstance().getWorkInfoByIdLiveData(tax_bill_info_request.id).observe(this, Observer {
restore_textview.text =restore_textview.text.toString() + it.outputData.getString("method")+" "+it.state.name
})
WorkManager.getInstance().getWorkInfoByIdLiveData(category_request.id).observe(this, Observer {
restore_textview.text =restore_textview.text.toString() + it.outputData.getString("method")+" "+it.state.name
})
restoreButton?.setOnClickListener{view ->
try {
startRestore()
}catch (e:Exception){
Log.wtf(TAG,e.message)
}
}
fun startRestore(){
WorkManager.getInstance()
.beginWith(requests.get(0))
.then(requests.get(1))
.enqueue()
}
解决方案
堆栈跟踪不指示 WorkManager 的任何内容。看起来您的 RestoreManager#onResponse 正在主线程上发生。您应该检查那段代码发生了什么。也许您的网络响应会自动传递到主线程。
推荐阅读
- angular - 在不相关的组件之间传递值
- c++ - 英特尔 MKL OOP 包装器设计和运算符重载
- rstudio - R 可以用作企业应用程序的主要平台吗?
- javascript - 反应传播运算符在嵌套状态更新时抛出错误
- swift - Venmo 深度链接
- c# - 捕获线程中抛出的异常
- python - 在没有 conda 的情况下安装 gdcm
- apache-spark - 在 Spark Dataframe Java API (spark v2.3.0) 中执行相关标量子查询
- python - 创建多年的月均值列
- spring-boot - 无法使用 Spring Boot 运行此 JPA 代码