Выполнение нескольких экземпляров Runnable в отдельных потоках приводит к сбою приложения без журнала - PullRequest
0 голосов
/ 01 июля 2018

Что я делаю не так? Приведенный ниже код дает сбой во время второго цикла, когда создается второй поток. Я пробовал AsyncTask, Executor, ThreadPoolExecutor .... но все равно вылетает.

Чего я хочу добиться, так это параллельно запускать экземпляры runnable в отдельных потоках, чтобы использовать преимущества других ядер процессора и оперативной памяти. Код хорошо работает последовательно.

if (!listOfSubLists.isEmpty()) {
  for (final List<String> subList : listOfSubLists) {
    if (!subList.isEmpty()) {
      new Thread(new Runnable() {
        @Override
        public void run() {
          int sc1 = 0; //int count = arFPSubAppIDs.length;
          for (String appID : subList) {
            FingerPrint fingerPrint = mDBHelper.fetchFingerPrint(appID, FingerPrint.RIGHT_INDEX);
            if (fingerPrint != null) {
              List<String> alFingerData = fingerPrint.getFingerData();
              for (String encodedFPData : alFingerData) {
                if (!TextUtils.isEmpty(encodedFPData)) {
                  int sc2;
                  byte[] fpDataB = Base64.decode(encodedFPData, Base64.DEFAULT);
                  sc2 = FPMatch.getInstance().MatchFingerData(mRefData, fpDataB);
                  if (sc2 > sc1) {
                    sc1 = sc2;
                  }

                }
              }

              if (sc1 >= TEMPLATE_MATCHING_THRESHOLD) {
                //Match found ...
                //all tasks completed
                final long diff = /*System.currentTimeMillis()*/System.nanoTime()-startTime1;

                final int finalSc = sc1;
                runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                    tvStatus4.setText(String.format("Time:%s, Score:%s", String.valueOf(diff),String.valueOf(finalSc)));
                    Toast.makeText(BluetoothReader2.this, "Template Matched!", Toast.LENGTH_SHORT).show();
                    closeProgressDialog();
                  }
                });

                //mFPHandler.obtainMessage(sc1).sendToTarget();
                /*Message msg = mFPHandler.obtainMessage(TEMPLATE_MATCHED_MESSAGE); //set what message ...
                Bundle bundle = new Bundle();
                bundle.putInt(TEMPLATE_MATCHING_SCORE, sc1);
                bundle.putString(TEMPLATE_MATCHING_APPID, appID);
                bundle.putString(TEMPLATE_MATCHING_TASKID, mTaskID);
                msg.setData(bundle);
                mFPHandler.sendMessage(msg);*/
              }
            }
          }
          //Task completed....
          mTemplateMatchingMessageTotalCount++;
          if (mTemplateMatchingMessageTotalCount==listCount) {
            //all tasks completed
            final long diff = /*System.currentTimeMillis()*/System.nanoTime()-startTime1;

            runOnUiThread(new Runnable() {
              @Override
              public void run() {
                tvStatus4.setText(String.format("Time:%s, ", String.valueOf(diff)));
                Toast.makeText(BluetoothReader2.this, "All Tasks Completed", Toast.LENGTH_SHORT).show();
                closeProgressDialog();
              }
            });

          }

          //mFPHandler.obtainMessage(sc1).sendToTarget();
          /*Message msg = mFPHandler.obtainMessage(TASK_COMPLETED_MESSAGE); //set what message ...
          Bundle bundle = new Bundle();
          bundle.putInt(TEMPLATE_MATCHING_SCORE, sc1);
          msg.setData(bundle);
          mFPHandler.sendMessage(msg);*/
        }
      }).start();
    }  
  }
}
...