【问题标题】:crash Java apk with thread in android studio在android studio中使用线程崩溃Java apk
【发布时间】:2020-03-04 13:01:53
【问题描述】:

我是 Android 的 Java 编程新手,但我遇到了线程问题。我想用计数器制作一个简单的 apk。我想增加计数器并显示价值。 Android Studio 3.4.2 JRE 1.8.0

这是我的代码:

public class MainActivity extends AppCompatActivity {
private Button my_button;
private boolean  start_stop = false;
private int counter = 0;
private TextView my_text;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    my_button = findViewById(R.id.My_Button);
    my_text = findViewById(R.id.my_text);
}
public void onClick_button(View view) {
    if(start_stop != true) {
        my_button.setText("STOP");
        start_stop = true;

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (start_stop) {
                    my_text.setText(Integer.toString(counter));
                    counter++;
                    try {
                        Thread.sleep(1000);     // sleep 1 sec
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }else {
        my_button.setText("START");
        start_stop = false;
    }
}
@Override
protected void onDestroy() {
    super.onDestroy();
    start_stop = false;
}
}

在这种情况下,我的应用程序崩溃并显示消息“不幸的是,switch_picture 已停止”。在 Log cat 我有这个:

11-07 21:41:29.194 27684-27724/com.example.switch_pictures E/AndroidRuntime: 致命异常: Thread-416 进程:com.example.switch_pictures,PID:27684 android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。 在 android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357) 在 android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909) 在 android.view.ViewGroup.invalidateChild(ViewGroup.java:4690) 在 android.view.View.invalidateInternal(View.java:11801) 在 android.view.View.invalidate(View.java:11765) 在 android.view.View.invalidate(View.java:11749) 在 android.widget.TextView.checkForRelayout(TextView.java:6872) 在 android.widget.TextView.setText(TextView.java:4057) 在 android.widget.TextView.setText(TextView.java:3915) 在 android.widget.TextView.setText(TextView.java:3890) 在 com.example.switch_pictures.MainActivity$1.run(MainActivity.java:34) 在 java.lang.Thread.run(Thread.java:818) 11-07 21:41:29.867 27684-27702/com.example.switch_pictures D/EGL_emulation: eglMakeCurrent: 0xb432f100: 版本 2 0 (tinfo 0xb429fdc0)

【问题讨论】:

标签: java android multithreading


【解决方案1】:

您的代码的问题是您正试图从后台线程与 UI 元素进行交互。解决办法是

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (start_stop) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    my_text.setText(Integer.toString(counter));
                                }
                            });
                            counter++;
                            try {
                                Thread.sleep(1000);     // sleep 1 sec
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();

这里是runOnUiThread的文档

【讨论】:

  • 感谢您的回答,但我还有一个关于“while”和“thread.sleep”的问题 - 点击按钮后我的应用没有响应
  • 代码没有问题,我用线程的样子更新了答案。
  • 如果我在线程中有一个“while”,我的应用程序没有响应?你知道为什么吗?
  • 我刚刚试过你的代码,它工作得很好,你能详细解释一下错误吗?
  • 非常感谢!我在线程中写了圆圈:runOnUiThread{while},这是错误的。现在我明白我的错误了
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2018-07-18
  • 2020-06-30
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多