我刚开始使用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);
        }
    }

08-18 14:16