java - Java Android 多次启动/调用同一个线程

标签 java android multithreading

我需要在我的应用程序中多次调用同一个线程。使用我的原始代码,第一次可以很好地执行。但是第二次它崩溃了 - 然后我了解到每个线程只能执行一次。

我的原始代码:

View.OnClickListener myClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        mythread.start();
    }
};


Thread mythread = new Thread(){

    @Override
    public void run() {

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Running...");
            }
        });

     try {
        sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Finished...");
            }
        });
    }
};

正如我所说,如果我尝试第二次运行它,它就会崩溃。所以我试着修改它:

View.OnClickListener myClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        test();
    }
};

private void test(){

    Thread mythread = new Thread(){

        @Override
        public void run() {

            runOnUiThread(new Runnable() {
                public void run() {
                    demoBt.setText("Running...");
                }
            });

         try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }       

            runOnUiThread(new Runnable() {
                public void run() {
                    demoBt.setText("Finished...");
                }
            });
        }
    };

    mythread.start();
}

效果很好;但我的问题是,这是否是执行此操作的正确方法,或者是否有更优化的方法来执行此操作?

此外,从另一个线程的内部调用一个线程是否可以接受? (就像我把东西放在我的新线程中的 UI 线程上的方式)

编辑: 这只是一个例子。对于我的实际代码,我需要完成大量基于数学的模拟,这需要 10 秒才能完成。根据将显示给用户的结果,他们可能想要更改输入参数并让模拟再次运行。这将发生多次。

最佳答案

除了关于使用 AsyncTask 或 runOnUiThread() 的其他好答案之外,您还可以将私有(private)成员定义为 Runnable,如下所示:

private Runnable mytask = new Runnable() {
    @Override
    public void run() {

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Running...");
            }
        });

     try {
        sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       

        runOnUiThread(new Runnable() {
            public void run() {
                demoBt.setText("Finished...");
            }
        });
    }
};

然后,无论什么时候你想运行它,做

new Thread(mytask).start();

关于java - Java Android 多次启动/调用同一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359813/

相关文章:

android - 无法启动 appium session

java - 由另一个 Thread Java smartcardio 建立的独占访问

c++ - 多个客户端程序如何同时相互共享消息?

ios - 我是否需要在 DispatchQueue.main.async 中使用 autoreleasepool block

java - T 是测试用例的数量。N 是数组的大小,k 是数组右旋转的次数。如何在 java 中执行此操作

java - 为什么 Android 小部件中的可运行 View 未更新?

java - SVNKit : list of updated/added files in a working copy after update operation

java - Android(事物): How to do clean-up before program ends?

java - 如何在android中获取连接到同一网络的设备的mac地址?

android - AlertDialog.show 在服务中被静默忽略