0

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

为此使用了 runOnUiThread 和 Hadnler,一切似乎都运行良好(sysout 和调试显示两个线程都已执行并且值已正确更新)。但是,在 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);
                    }
                });
            }
        }
    });

经历了该领域的许多先前问题,但似乎没有一个针对此问题的具体解决方案。

提前致谢。

解决方案:

最后,我使用了 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
        }
    }
4

1 回答 1

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
    }
}
于 2016-09-25T03:22:12.780 回答