java - 为什么我在更新 TextView 时得到 Resources$NotFoundException?

标签 java android multithreading

我正在为 android 编写一个简单的秒表应用程序,它只会在按下开始时保持计数器每秒更新,并使用相同的按钮暂停它。在我的 main.xml 布局中,我有一个 TextView 和一个 Button,除此之外别无其他。 这是我到目前为止所写的内容。

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btnToggle;
    private TextView tvStopwatch;
    public Handler updateStopwatch;

    private enum Status {
        WORKING,
        STOPPED
    }

    private Status stopwatchStatus;

    private void toggleStatus() {
        if (stopwatchStatus == Status.WORKING) {
            stopwatchStatus = Status.STOPPED;
            Stopwatch.getStopwatch().dispose();
            btnToggle.setText("Start");
        }else{
            stopwatchStatus = Status.WORKING;
            Stopwatch.getStopwatch().start();
            btnToggle.setText("Stop");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initView();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnToggle:
                toggleStatus();
                break;
        }
    }

    private void initView() {
        btnToggle = (Button) findViewById(R.id.btnToggle);
        tvStopwatch = (TextView) findViewById(R.id.tvStopwatch);

        updateStopwatch = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                tvStopwatch.setText(msg.what);
            }
        };

        Stopwatch.getStopwatch().setHandler(updateStopwatch);
        btnToggle.setOnClickListener(this);

        stopwatchStatus = Status.STOPPED;
    }



    public static class Stopwatch {

        private int timestamp;

        private boolean working;

        private Handler updateStopwatch;

        private Stopwatch() {

        }

        private static Stopwatch stopwatch;

        public static Stopwatch getStopwatch() {

            if (stopwatch == null) {
                stopwatch = new Stopwatch();
            }
            return stopwatch;
        }

        public void setHandler(Handler updateStopwatch){
            this.updateStopwatch = updateStopwatch;
        }

        public void start() {

            if (!working) {

                working = true;

                Thread tick = new Thread() {
                    public void run() {
                        while (working) {
                            try {
                                sleep(1000);
                            } catch (InterruptedException ex) {
                                ex.printStackTrace();
                            } finally {
                                timestamp++;
                                updateStopwatch.sendEmptyMessage(timestamp);
                            }
                        }
                    }
                };

                tick.start();
            }
        }

        public void dispose() {
            working = false;
        }
    }
}

关键是,我希望我的秒表在它的单独线程中工作,并在我的主 UI 线程中有一个处理程序,它将不断更新 TextView,但是当我调试我的应用程序时,它一直在这一行抛出异常

tvStopwatch.setText(msg.what);

我对 Handlers 很陌生,所以我想我只是缺少一些基本的东西。 这也是异常的日志

android.content.res.Resources$NotFoundException: String resource ID #0x1
            at android.content.res.Resources.getText(Resources.java:1057)
            at android.widget.TextView.setText(TextView.java:4186)
            at unisoftdevelopment.com.stopwatch.MainActivity$1.handleMessage(MainActivity.java:61)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5279)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)

请帮助找出问题所在,在此先感谢。

最佳答案

常犯的错误:setText() 有一个接受整数的重载(必须是字符串资源 ID,例如 R.string.my_string)。

当您收到消息时:

tvStopwatch.setText(msg.what);

它试图将 msg.what 解析为字符串资源,并在找不到时崩溃。您应该改为将时间戳转换为字符串,然后改用它:

tvStopwatch.setText(String.valueOf(msg.what));

关于java - 为什么我在更新 TextView 时得到 Resources$NotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25025589/

相关文章:

java - Swagger @ApiOperation 可以允许在 Java 中指定列表列表吗?

java - 在 SQLite Android 中检索额外结果

android - SQLite 和填充 ListView ,android

java - 为什么当 Intent 双值时我得到 null

c++ - 从主线程 c++11 执行函数调用的线程

java - 搜索 unicode 字符串

java - 将字节写入文件然后读取会产生不同的字节

java - 这段Java代码中加号的作用是什么?

wpf - Dispatcher 与后台线程有何不同?

multithreading - WP7 - 访问 UI 线程?