Я довольно плохо знаком с потоками в android, но у меня есть вопрос.
Необходимое условие: Проект похож на приложение Uber. У меня есть модальное всплывающее окно, которое запрашивает драйвер. Если в течение одной минуты драйвер не доступен, модальное устройство должно закрыться и уведомить пользователя, что драйвер не найден. Если ответ был получен в течение одной минуты, модал также должен скрывать, но отображать другое представление.
У меня есть 2 разных потока, которые мне нужно запустить одновременно. Я попытался поместить все функции, которые мне нужны, в один поток, но, похоже, это не сработало.
Первый поток зацикливается при проверке, был ли найден драйвер. Второй поток скрывает показ мод и, если драйвер не получен, он должен завершить первый поток.
Проблема Первый поток работает одновременно со вторым, но не скрывает ни модальное, ни это показывает другое представление в случае, если драйвер доступен.
Буду признателен за любую помощь.
Пожалуйста, игнорируйте журналы, я пытался понять логи c потока внутри потоков
private void showRequestPopUp(View view){
int width = LinearLayout.LayoutParams.MATCH_PARENT;
int height = LinearLayout.LayoutParams.MATCH_PARENT;
locationLayout.setVisibility(View.GONE);
requestLayout.setVisibility(View.GONE);
driverLayout.setVisibility(View.GONE);
geoLocation.setVisibility(View.GONE);
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View requestRidePopUp = Objects.requireNonNull(layoutInflater).inflate(R.layout.modal_request_ride, null);
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(requestRidePopUp, width, height, focusable);
popupWindow.setElevation(8);
popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
requestRidePopUp.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
popupWindow.isShowing();
return true;
}
});
// Thread Initialization
Thread loadingThread;
final Thread exitThread;
final Handler handler = new Handler();
exitThread = new Thread() {
@Override
public void run() {
Looper.prepare();
// Update the progress bar
handler.post(new Runnable() {
public void run() {
if (!Thread.interrupted()) {
Log.e(TAG, "Running Exit Thread");
while(STOP_THREAD) {
if (DR_NAME != null) {
Log.e(TAG, "STOP THREAD: ");
showDriverDetails();
popupWindow.dismiss();
}
Thread.interrupted();
Log.e(TAG, "Thread Status: " + Thread.interrupted());
}
}
}
});
}
};
// Dismiss Loading Window After 1 Minute
loadingThread = new Thread() {
@Override
public void run() {
Log.e(TAG, "Running Loading Thread");
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
Log.e(TAG, "EXCEPTION: " + e.getMessage());
}
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!interrupted()) {
Log.e(TAG, "Hide Loading Screen");
if (DR_NAME == null) {
Toast.makeText(Home.this, "We could not find any driver near you. Try again Later", Toast.LENGTH_LONG).show();
popupWindow.dismiss();
locationLayout.setVisibility(View.GONE);
requestLayout.setVisibility(View.VISIBLE);
driverLayout.setVisibility(View.GONE);
geoLocation.setVisibility(View.VISIBLE);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams)
geoLocation.getLayoutParams();
layoutParams.setMargins(0, 0, 0, 590);
geoLocation.setLayoutParams(layoutParams);
// End Exit Thread
STOP_THREAD = true;
Thread.interrupted();
Log.e(TAG, "Interrupted Loading Thread: " + Thread.interrupted());
}
}
}
});
}
};
loadingThread.start();
exitThread.start();
// Request Ride
requestRideNotification();
Button cancelRide = requestRidePopUp.findViewById(R.id.cancelRequest);
cancelRide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
locationLayout.setVisibility(View.GONE);
requestLayout.setVisibility(View.VISIBLE);
driverLayout.setVisibility(View.GONE);
geoLocation.setVisibility(View.VISIBLE);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams)
geoLocation.getLayoutParams();
layoutParams.setMargins(0, 0, 0, 590);
geoLocation.setLayoutParams(layoutParams);
}
});
}