Что я делаю не так?
Приведенный ниже код дает сбой во время второго цикла, когда создается второй поток.
Я пробовал 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();
}
}
}