我在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);
}
}
答案 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()
由于