我刚开始使用Android上的简单线程处理程序。该代码有效。唯一的部分是如何关闭处理程序。我徒劳地试图关闭处理程序onPause(),但它一直在运行。有什么建议么?
这是代码:
我的主要活动线程:
package com.test.prog;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
public class AndroidThreadProgv1Activity extends Activity {
private Handler DataHandler;
private DataUpdater du;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Initialize handler to allow UI updating in other threads */
DataHandler = new Handler();
startDataUpdater();
}
public void onPause(){
super.onPause();
du.stopConnection();
}
private void startDataUpdater(){
System.out.println("In startDataUpdater");
du = new DataUpdater(DataHandler,(TextView) findViewById(R.id.textView1));
du.start();
}
}
DataUpdater.java:
package com.test.prog;
import java.io.IOException;
import android.os.Handler;
import android.os.Looper;
import android.widget.TextView;
/*
* Data updater thread. Updates the display with the response.
*/
public class DataUpdater extends Thread{
/*Handler for the UI update*/
private Handler dataRefreshHandler;
/*The UI text displaying the data*/
private TextView dataLabel;
/*data value*/
private int data = 0;
/*data update rate in ms*/
private static final int dataUpdateRate = 2000;
private boolean stoppedFlag= false;
public DataUpdater(Handler handler, TextView tv){
this.dataRefreshHandler = handler;
this.dataLabel = tv;
}
public void stopConnection()
{
if(this.dataRefreshHandler != null) {
this.dataRefreshHandler.removeMessages(data); // Remove a delayed message
System.out.println("In stopConnection");
/*
if(!stoppedFlag){
this.dataRefreshHandler.getLooper().quit(); // Warning
stoppedFlag = true;
}
*/
}
}
@Override
public void run(){
try {
while(true){
System.out.println("In run");
data = data + 1;
updateData();
Thread.sleep(dataUpdateRate);
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
/*
* Calls the UI Handler and updates the display
*/
private void updateData(){
dataRefreshHandler.post(new Runnable() {
public void run() {
if(data==0)
{
dataLabel.setText("Value not known");
}
else
{
System.out.println("In update");
dataLabel.setText("Value="+data);
}
}
});
}
}
最佳答案
您在dataUpdater中的“运行”方法具有while(true)
循环。您永远不会检查任何退出条件,因此它永远不会停止。您可以做的是在DataUpdater中包含一个volatile
标志(最初设置为true),并将stopConnection
设置为false。您在run
中的while循环可以检查该标志,而不仅仅是无限循环。
为了确保您的DataUpdater在活动运行时都在运行,请执行以下操作:
将对startDataUpdater();
的调用从onCreate
移至onResume
(Android总是在onCreate之后调用onResume,这样可以确保您始终在创建以及暂停后恢复时都调用startDataUpdater)。
在DataUpdater中更改运行方法,如下所示:
public void run(){
isRunning = true; // isRunning should be declared as a "private volatile boolean"
try {
while(isRunning){
System.out.println("In run");
data = data + 1;
updateData();
Thread.sleep(dataUpdateRate);
}
}