0

У меня проблема при использовании callBatchTasks, и я пытаюсь сохранить более 30000 записей в базе данных. Я делаю метод в задаче async, чтобы не блокировать основной поток. Когда я не использую callBatchTaks, для сохранения данных требуется более 30 минут, но когда я его использую, время идет до 6-10 минут. Единственная проблема заключается в том, что через 1-2 минуты он блокирует мой индикатор выполнения (он отображается, когда данные сохраняются) и отображает сообщение ожидания/включения, как приложение не отвечает. Вопрос в том, как я могу избежать блока anr. Вот мой код:ORMLite callBatchTasks и отзывчивая ошибка от Android

new AsyncTask() { 
      @Override 
      protected String doInBackground(Object... params) { 
       String response = ""; 

       Log.e(LOG_TAG, "Update started"); 

       try { 
        getAMISCardRuntimeDao().callBatchTasks(new Callable<Object>(){ 
         @Override 
         public Object call() throws Exception { 
          for (int i = 0; i < data.getCardListSize(); i++) { 
           createOrUpdateCard(doTransactions, data.getCard(i)); 
          } 
          return null; 
         } 

        }); 
       } catch (Exception e) { 
        Log.d(LOG_TAG, "updateListOfObjects. Exception " + e.toString()); 
        return null; 
       } 

       return response; 
      } 

      @Override 
      protected void onPostExecute(Object msg) { 
       if (msg != null) { 
       } 

      } 
     }.execute(null, null, null); 

Спасибо.

ответ

0

Решила проблему. Создал объекты, которые управляют потоками, и, разбив мой массив, мне удалось сделать цикл асинхронным и не блокировать UIThread

try { 
        getCardRuntimeDao().callBatchTasks(new Callable<Object>() { 
         @Override 
         public Object call() throws Exception { 
          int numberOfThreads = Runtime.getRuntime().availableProcessors(); 
          int chunk = data.getCardListSize()/numberOfThreads; 
          ArrayList<Thread> threadArrayList = new ArrayList<>(); 

          for (int i = 0; i < numberOfThreads; i ++){ 
           Thread updateMultiThread; 
           if (i == numberOfThreads - 1) 
            updateMultiThread = new Thread(new UpdateMultiThread(data.getCardList(), DatabaseHelper.this, doTransactions, i * chunk, data.getCardListSize())); 
           else 
            updateMultiThread = new Thread(new UpdateMultiThread(data.getCardList(), DatabaseHelper.this, doTransactions, i * chunk, (i + 1) * chunk)); 

           threadArrayList.add(updateMultiThread); 
           updateMultiThread.start(); 
          } 

          for (Thread thread : threadArrayList){ 
           try { 
            thread.join(); 
           } catch (InterruptedException e) { 
            e.printStackTrace(); 

            retryDatabaseUpdate(); 
           } 
          } 

          return null; 
         } 
        }); 
       } catch (Exception e) { 
        Log.d(LOG_TAG, "updateListOfObjects. Exception " + e.toString()); 
       } 
Смежные вопросы