runOnUiThread无法正常工作

时间:2016-09-24 10:27:54

标签: android-runonuithread android-timer

我正在尝试在android中创建textview,显示剩余时间(秒)。

为此使用了runOnUiThread和Hadnler,一切似乎都正常工作(sysout和debug显示两个线程都已执行并且值正确更新)。 但是,在UI上,textview值未正确更新。当线程完成时,它会使用最后一个值进行更新。

我在片段的私有方法中写下面的代码。

final TextView timerText =(TextView)mainView.findViewById(R.id.timerText);         timerText.setText(R.string.maxAllowedSeconds);

    handler.post(new Runnable() {
        @Override
        public void run() {
            while(true)
            {
                System.out.println("Text:"+ ""+maxAllowedSeconds);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                maxAllowedSeconds--;
                if(maxAllowedSeconds <= 0)
                    break;
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Running on UI Thread : " + maxAllowedSeconds);
                        timerText.setText("" + maxAllowedSeconds);
                    }
                });
            }
        }
    });

通过此领域的许多先前问题,但似乎没有一个问题具体解决这个问题。

提前致谢。

SOLUTOIN:

最后,我使用了AsynchTask,它按预期完美地运行。

private class RapidFireAsyncTimerTask extends AsyncTask<Integer, Integer, Void> {

        private Context context;
        private View rootView;

        public RapidFireAsyncTimerTask(Context ctx, View rootView) {

            this.context = ctx;
            this.rootView = rootView;
        }

        @Override
        protected Void doInBackground(Integer... params) {

            int maxSec= params[0];
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(--maxSec);
                if (maxSec <= 0)
                    break;
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(final Integer... values) {

            ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]);
        }

        @Override
        protected void onPostExecute(Void aVoid) {

            //next task
        }
    }

1 个答案:

答案 0 :(得分:0)

而不是Handler,它与AsynchTask一起工作(不需要runOnUiThread)。

 public RapidFireAsyncTimerTask(Context ctx, View rootView) {

        this.context = ctx;
        this.rootView = rootView;
    }

    @Override
    protected Void doInBackground(Integer... params) {

        int maxSec= params[0];
        while (true) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            publishProgress(--maxSec);
            if (maxSec <= 0)
                break;
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(final Integer... values) {

        ((TextView) rootView.findViewById(R.id.timerText)).setText("" + values[0]);
    }

    @Override
    protected void onPostExecute(Void aVoid) {

        //next task
    }
}