Проблема, похоже, исходит от CountDownLatch, который блокирует поток, вместо этого вы должны создать интерфейс в своем пользовательском диалоговом классе, где у вас есть onResult()
(или как вы хотите это называть), который вы реализуете в другом месте.
Вам нужно будет передать слушателя вашему showDialog()
, который реализует onResult()
, и в вашей кнопке ОК onClick
вы звоните listener.onResult()
Интерфейс (в CustomInputDialog.java):
interface CustomInputDialogListener{
void onResult(ArrayList<String> result);
}
Новые параметры для передачи в showDialog:
static void showDialog(final Context context, String title, final ArrayList<Field> fields, final CustomInputDialogListener listener) {
...
}
Конец вашей кнопки ОК на клике ():
dialog.dismiss();
listener.onResult(result);
//latch.countDown(); //you don't need that anymore
Log.d(TAG, "showDialog: latch count down 1");
Вы можете удалить создание защелки и блок try / catch с помощью операторов wait и return в конце
//Log.d(TAG, "showDialog: latch created");
//final CountDownLatch latch = new CountDownLatch(1);
/*try {
Log.d(TAG, "showDialog: latch await");
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (result.isEmpty()) {
return null;
} else {
return result;
}
}*/
В вашем MainActivity.java у вас есть 2 варианта:
Реализация CustomInputDialogListener и передача этого в showDialog
Заголовок вашей MainActivity должен выглядеть следующим образом:
public class MainActivity extends AppCompatActivity implements CustomInputDialog.CustomInputDialogListener {
...
}
И вам придется реализовать onResult ():
@Override
public void onResult(ArrayList<String> result) {
this.result = result;
doThings();
}
И когда вы вызываете showDialog (), вы передаете это:
CustomInputDialog.showDialog(Test14dialog.this, "Title", fields, this);
Вы напрямую реализуете onResult:
CustomInputDialog.showDialog(Test14dialog.this, "Title", fields, new CustomInputDialog.CustomInputDialogListener() {
@Override
public void onResult(ArrayList<String> result) {
this.result = result;
doThings();
}
});
Вы не должны блокировать потоки при отображении диалогового окна.