Запуск двух разных потоков одновременно в android - PullRequest
1 голос
/ 08 апреля 2020

Я довольно плохо знаком с потоками в 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);
        }
    });
}

1 Ответ

0 голосов
/ 13 апреля 2020

Я получил помощь от друга, и все, что мне нужно было сделать, это реорганизовать поток информации внутри первого потока и walla!

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 responseThread;
    final Handler handler = new Handler();

    responseThread = new Thread() {
        @Override
        public void run() {
            Looper.prepare();
            int count = 0;

            while(!STOP_THREAD) {
                count ++;
            }

            if (DR_NAME != null) {
                handler.post(new Runnable() {
                    public void run() {
                        if (!Thread.interrupted()) {
                            Log.e(TAG, "Running Response Thread");
                            Log.e(TAG, "Response Thread DR_NAME: " + DR_NAME);
                            showDriverDetails();
                            popupWindow.dismiss();

                            Log.e(TAG, "Stop Thread: " + STOP_THREAD);
                            Thread.currentThread().interrupt();
                            Log.e(TAG, "Interrupt Response Thread: " + 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, "Active Loading Thread");

                        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.currentThread().interrupt();
                            Log.e(TAG, "Interrupt Loading Thread: " + Thread.interrupted());
                        } else {
                            // End Exit Thread
                            STOP_THREAD = false;
                            Thread.currentThread().interrupt();
                            Log.e(TAG, "Interrupt Loading Thread: " + Thread.interrupted());
                        }
                    }
                }
            });
        }
    };

    loadingThread.start();
    responseThread.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);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...