如何在Android中停止线程处理程序?

时间:2011-11-22 14:13:03

标签: android

我刚开始在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);

                }
            }
        });
    }
}

2 个答案:

答案 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)

更有效