Диспетчер работ не может работать в фоновом потоке при вставке значений в базу данных - PullRequest
0 голосов
/ 17 февраля 2019

Я попытался извлечь данные с помощью модернизации, а затем с помощью тела ответа я пытаюсь вставить столбцы в базу данных комнат с помощью диспетчера работ.Но все равно это выдает ошибку Network в главном потоке, даже если метод doWork () работает в фоновом потоке. Пожалуйста, помогите мне с решением, отличным от введения асинхронной задачи, потому что, если введена асинхронная задача, то мои методы WorkManager по умолчанию, такие как beginWith (), являются моими., затем () начнет работать параллельно, а не последовательно.

BillTaxInfoDAO billTaxInfoDAO = db.billTaxInfoDao ();billTaxInfoDAO.insert (billTaxInfo);эти две строки задают исключение для сети в главном потоке.

Ошибка: невозможно получить доступ к базе данных в главном потоке, поскольку она может заблокировать пользовательский интерфейс на длительный период времени.по адресу androidx.room.RoomDatabase.assertNotMainThread (RoomDatabase.java:209) по адресу androidx.room.RoomDatabase.beginTransaction (RoomDatabase.java:256) по адресу com.witbybit.offlinepos.datamodels.pointofsale.BillTaxInfoDAO_Impl.in.jpg (Bill) в com.witbybit.offlinepos.restore.RestoreManager $ 4.onResponse (RestoreManager.java:196)

MyWorker Class

@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);
        }
    });
}

Это мой фрагмент класса Calling

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()
}

1 Ответ

0 голосов
/ 19 февраля 2019

Stacktrace ничего не указывает с WorkManager.Похоже, что ваш RestoreManager # onResponse происходит в основном потоке.Вы должны проверить, что происходит с этим фрагментом кода.Возможно, ваши сетевые ответы автоматически доставляются в основной поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...