java - 按下按钮时启动无限循环线程,再次按下按钮时停止

标签 java android multithreading

我正在模拟相机馈送,并有一个可以无限循环图像的按钮。 它在单击按钮时启动,单击按钮时应该停止线程,直到再次单击按钮。

现在它启动并循环正常,但是当我再次单击它时它崩溃了

点击时

    public void onClick(View v) {
       switch(v.getId()){

       case R.id.cam1btn:{
         if(thread1 == null){
           thread1 = new Thread(){
                public void run(){
                  Cam1();
                }
            };
            thread1.start();

         }
         else
         {
             thread1.stop();
             thread1=(null);
         }

       }
       break;

Cam1功能

protected void Cam1() {
    int i=0;

    do{
        System.out.println("got into  loop");
        for(int x=0;x<4;x++){

            //imgFeed1.setImageAlpha(camFeed1[x]);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            final int temp = x;
            mCam1Handler.post(new Runnable(){
                public void run(){
                    imgFeed1.setImageResource(camFeed1[temp]);
                }
            });

            }

    }while(i == 0);


}

日志猫

logcat

最佳答案

一般来说,您不应该强行停止线程。线程必须通过完成其任务来停止。

在您的情况下,您需要在实例范围中定义 i = 0 并在用户单击停止按钮时将其设置为某个值,这样您的 while 循环就会结束并且线程完成其任务。

我宁愿建议您维护一个 boolean 标志而不是 int

更新 好的,那么你应该有一个标志并第一次切换例如:toRun = false,当用户单击按钮时,你会执行 toRun = !toRun;。在你的 run 方法中应该有一个 while(toRun) { //重复你的任务 }

关于java - 按下按钮时启动无限循环线程,再次按下按钮时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924672/

相关文章:

java - 当 RecyclerView 为空时如何使 SwipeRefreshLayout 工作

android - 如果一个 Android Service 被多次启动会发生什么?

c# - 暂停和恢复下载 WPF

multithreading - Jmeter 当前线程数?

java - 我们可以在线程执行时更改线程的优先级吗?更改会发生还是操作系统会忽略它?(Java)

java - 只有最后一个值是从 jTable 中的数据库打印的

java - ArrayList<Superclass> 中的子类方法调用问题

java - OSGi 菲利克斯 : Sharing a class between the host application and a bundle possible?

java - 可嵌入对象集合的级联删除

android - 如何在 doInBackground() 方法中定期检查 isCancelled()