如何阻止这个运行的线程?

时间:2012-08-21 11:40:44

标签: android multithreading

public class MainActivity extends Activity implements Runnable{

    private int progressBarStatus = 0;
    private Handler progressBarHandler = new Handler();
    ProgressBar linProgressBar;
    private long fileSize = 0;
    Thread t1;

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

        Button b1 = (Button)findViewById(R.id.button1);
       Button b2 = (Button)findViewById(R.id.button2);

        b2.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0) 
            {

                linProgressBar.setProgress(0);
                t1.interrupt();
            }

         });

    b1.setOnClickListener(new OnClickListener()
     {

        @Override
        public void onClick(View arg0) 
        {

            basicInitializations();

        }

     });

    }


    public void basicInitializations(){

        linProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
        linProgressBar.setProgress(0);
        linProgressBar.setMax(100);

        try{
            t1 = new Thread() 
            {
                public void run() {
                    while (progressBarStatus < 100) {

                        // process some tasks
                        progressBarStatus = doSomeTasks();

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

                        // Update the progress bar
                        progressBarHandler.post(new Runnable() {
                            public void run() {
                                linProgressBar.setProgress(progressBarStatus);
                            }
                        });
                    }

                    if (progressBarStatus >= 100) {

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

                    }
                }
            };

            t1.start();

        }catch (Exception e) {

        }


    }
    public int doSomeTasks() {

        while (fileSize <= 1000000) {

            fileSize++;

            if (fileSize == 100000) {
                return 10;
            } else if (fileSize == 200000) {
                return 20;
            } else if (fileSize == 300000) {
                return 30;
            }else if (fileSize == 400000) {
                return 40;
            }else if (fileSize == 500000) {
                return 50;
            }

        }

        return 100;

    }


    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

这是我的主要代码,我无法阻止这个帖子。 我想在我点击按钮b2(比如取消按钮)时停止它。 上面的代码不是原始代码,是一个模型,所以请告诉我如何停止该线程。

提前谢谢你。 。 。 。

2 个答案:

答案 0 :(得分:0)

您的帖子大部分时间都花在Thread.sleep()上,这很有帮助。线程指针t1是一个类成员,这也很有帮助。在您的按钮处理程序中,您可以查看t1是否仍然有效,如果是,请致电t1.interrupt();。这将导致线程的当前睡眠和将来的睡眠抛出InterruptedException ...现在你只需修改你的异常处理程序就可以退出线程。

答案 1 :(得分:0)

我有一个替代答案可以尝试相同,在你的runnable循环中总是检查一个标志为run_flag,创建它作为成员变量并将其设置为true一旦你盯着循环,你可以使它run_flag为假我们无论你什么时候完成后,你可以同时为你的线程设置null ...通过runnable循环和线程出来的更安全的方法。

try{
        t1 = new Thread() 
        {
            public void run() {
                while (progressBarStatus < 100 && run_flag == true) { // added run_flag here

                    // process some tasks
                    progressBarStatus = doSomeTasks();

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

                    // Update the progress bar
                    progressBarHandler.post(new Runnable() {
                        public void run() {
                            linProgressBar.setProgress(progressBarStatus);
                        }
                    });
                }

                if (progressBarStatus >= 100) {

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

                }
            }
        };

        t1.start();

    }catch (Exception e) {

    }