我刚开始在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);
}
}
});
}
}
答案 0 :(得分:2)
dataUpdater中的“run”方法有一个while(true)
循环。你永远不会检查任何退出条件,所以它永远不会停止。您可以做的是在DataUpdater中包含volatile
标志(最初设置为true)并将stopConnection
设置为false。 run
中的while循环可以检查该标志而不是无限循环。
要确保您的活动正在运行时DataUpdater正在运行:
将来自startDataUpdater();
的呼叫从onCreate
移至onResume
(Android始终在onCreate后调用onResume,这样可确保您在创建时始终调用startDataUpdater,并在暂停后继续调用)。
将DataUpdater中的run方法更改为:
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);
}
}
答案 1 :(得分:2)
您可以使用Looper的用户,而不是使用作为CPU hogger的while(1)。 对于循环,您可以将消息发布回looper中的相同处理程序。 当你想要在runnable的run()方法中将可运行的Looper.myLooper.stop()发布到looper时停止。
Looper比While(true)
更有效