Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio中的线程(onClick)_Java_Android_Multithreading - Fatal编程技术网

Java Android Studio中的线程(onClick)

Java Android Studio中的线程(onClick),java,android,multithreading,Java,Android,Multithreading,我正在使用简单线程的easy代码,这显然在java上非常有效。 有一次我想在Android Studio上运行一个非常类似的程序(我想在点击一个按钮后运行) 一切都不顺利: 我的纽扣 public void onClickRoll(View v) throws InterruptedException { System.out.println("START!"); t.start(); while (t.isAlive()) {

我正在使用简单线程的easy代码,这显然在java上非常有效。 有一次我想在Android Studio上运行一个非常类似的程序(我想在点击一个按钮后运行) 一切都不顺利:

我的纽扣

public void onClickRoll(View v) throws InterruptedException
    {

        System.out.println("START!");
        t.start();
        while (t.isAlive()) {
            System.out.println("Still waiting...");
            t.join(1000);
        }
        System.out.println("EVERYTHING TERMINATED");
}
我的帖子:

private static class Sender
            implements Runnable {
        public void run() {
            try {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(400);
                    System.out.println("You've already been waiting:" +(float)i*0.4+"s");
                }
            } catch (InterruptedException e) {
                System.out.println("ERROR!");
            }
        }
错误显示带有
t.start()的行

开始应用时,控制台会显示错误, 当我第一次运行应用程序时,它的线程工作正常(无错误),当我再次单击按钮时,它崩溃(有相同的错误),(我等待10秒以确保线程结束)

少了什么? 除了InteliJ,我们还需要在Android Studio上使用treading做些别的事情吗

其他问题: 为什么这个代码也起作用?它不是新线程,但显示相同的错误:

   for (int i = 0; i < 10; i++) {
        wait(400);
        System.out.println("You've already been waiting:" +(float)i*0.4+"s");
    }
for(int i=0;i<10;i++){
等待(400);
System.out.println(“您已经在等待:”+(float)i*0.4+“s”);
}

我假设您在某个地方有代码来创建t,比如线程t=新线程(…)

因此,不能多次启动线程。因此,您应该将createt放在onClick方法中。这是最简单的部分

要持续使用线程,您需要与它进行通信,这远远超出您的问题。

以下几点:

  • 您的IDE(Android Studio)与您的问题完全无关(我已编辑您的问题以删除标记)

  • 在Android框架中,发送到stdout的所有内容,例如,
    System.out.println
    都发送到/dev/null,您永远不会看到它

  • Android框架中的线程有非常具体的要求。如果你非常小心的话,你可以启动自己的线程,但在任何情况下你都不应该启动,除非你正在为Android编写一个多线程框架,即使这样,也可能不会。你应该读一读

  • 我猜您是通过将主UI线程连接到后台线程来引发问题的。如果您阅读developer.android.com指南中的信息,您将看到您不应该在主UI线程上执行任何耗时的操作


您的IDE应该与您的程序无关。我会仔细阅读所有内容,谢谢您的回答,您说没有很多情况下我们应该使用线程,那么如何替换它们?这只是我的应用程序中的动画。有一句话,我在控制台中看到的“System.out.println”中的所有内容,很明显……不是不应该使用线程,而是不应该直接创建线程。有更高级的Android线程构造。您的IDE可能正在拦截System.out,但如果没有IDE,这将不会进入标准Android日志-请参阅
   for (int i = 0; i < 10; i++) {
        wait(400);
        System.out.println("You've already been waiting:" +(float)i*0.4+"s");
    }