How set a timeout for my thread Handler method?

MoHammaD ReZa DehGhani :

This is my function who run a code every 2.5 seconds and check if a value seted to the true my progress will gone and ...

mHandler = new Handler();
    continue_or_stop = true;
    new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (continue_or_stop) {
                try {
                    Thread.sleep(2500); // every 2.5 seconds
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            if (sp.getFromPreferences("state_update").equals("true")) {

                                progress_main.setVisibility(View.GONE);
                                layout_main.setVisibility(View.VISIBLE);
                                btn_save_send.setVisibility(View.GONE);


                                getOutputs();

                                MDToast.makeText(getActivity(), "وضعیت دستگاه با موفقیت بروزرسانی شد", Toast.LENGTH_LONG, MDToast.TYPE_SUCCESS).show();

                                sp.saveToPreferences("state_update", "false");

                                Intent intent = new Intent(getContext(), MainActivity.class);
                                startActivity(intent);

                            }

                            // you can set continue_or_stop to false, for stop
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();

now i want a time out for this method if the value not seted to true after a (for example 12 seconds) progress should gone and Toast it to user that something goes wrong and try again

frogatto :

You can check for the timeout based on the number of trials. Also using thread and Thread.sleep for running a periodic task is not a good practice.

To run a periodic task, you can post a Runnable to a Handler with some delay using postDelayed method.

private Handler mHandler = new Handler();
private int mTrials = 0;
private Runnable mPeriodicTask = new Runnable() {
    public void run() {
        // Do the check

        mTrials += 1;
        if (mTrials == /* timeout number */) {
            // timeout
        } else {
            mHandler.postDelayed(this, 2500);
        }
    }
}

To run the task:

mHandler.postDelayed(mPeriodicTask, 2500);

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=151791&siteId=1
Recommended