如果在android中使用runnable,请确定该线程是否正在运行

时间:2012-10-22 11:03:58

标签: android multithreading

我在android中为多线程创建了一个程序。

当我点击其中一个按钮时,它的线程启动并向EditText打印值现在我想确定该线程是否正在运行,以便我可以在运行时停止该线程,如果是,则启动一个新线程没有在这里运行是mu代码:

public void startProgress(View view) {
        final String v;
        if(view == b1)
        {
            v = "b1";
        }
        else
        {
            v = "b2";
        }
        // Do something long
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //for (int i = 0; i <= 10; i++) {
                while(true){
                    if(v.equals("b1"))
                    {
                        i++;
                    }
                    else if(v.equals("b2"))
                    {
                        j++;
                    }


                    try {
                        if(v.equals("b1"))
                        {
                            Thread.sleep(3000);
                        }
                        else if(v.equals("b2"))
                        {
                            Thread.sleep(1000);
                        }


                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //  progress.setProgress(value);
                            if(v.equals("b1"))
                            {
                                String strValue = ""+i;
                                t1.setText(strValue);
                            }
                            else
                            {
                                String strValue = ""+j;
                                t2.setText(strValue);
                            }

                            //t1.setText(value);
                        }
                    });
                }
            }
        };
        new Thread(runnable).start();
    }

@Override
    public void onClick(View v) {
        if(v == b1)
        {
            startProgress(b1);
        }
        else if(v == b2)
        {
            startProgress(b2);
        }

    }

3 个答案:

答案 0 :(得分:2)

在线程中使用静态AtomicBoolean并相应地翻转其值。如果布尔值为true,则表示您的线程已在运行。如果是,则退出该线程。在退出线程之前,将值设置为false。

答案 1 :(得分:2)

而不是那些凌乱的代码,AsyncTask可以完成您需要的工作并增加可读性......

它甚至有一个getStatus()函数to tell you if it is still running

你可以通过环顾四周来找到大量的例子(这里不再写一个)。我只需复制上面链接的文档中的那个:


用法

AsyncTask必须是子类才能使用。子类将覆盖至少一个方法(doInBackground(Params ...)),并且通常会覆盖第二个方法(onPostExecute(Result)。)

以下是子类化的示例:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

创建后,任务执行非常简单:

new DownloadFilesTask().execute(url1, url2, url3);

答案 2 :(得分:0)

有一些方法可以检查线程属性

你可以通过

检查Thread is Alive()

Thread.isAlive()方法返回布尔值。

您能够找到由

运行的运行线程
Thread.currentThread().getName()

由于