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

如何停止Android中的线程处理程序?,android,Android,我刚开始在Android上开发一个简单的线程处理程序。代码是有效的。唯一的部分是关于如何关闭处理程序。我尝试在暂停时关闭处理程序是徒劳的,但它只是继续运行。有什么建议吗 代码如下: 我的主要活动线程: package com.test.prog; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public cla

我刚开始在Android上开发一个简单的线程处理程序。代码是有效的。唯一的部分是关于如何关闭处理程序。我尝试在暂停时关闭处理程序是徒劳的,但它只是继续运行。有什么建议吗

代码如下: 我的主要活动线程:

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中的run方法有一个whiletrue循环。您从不检查任何退出条件,因此它永远不会停止。您可以做的是在DataUpdater中包含一个volatile标志,最初设置为true,然后让stopConnection将其设置为false。运行中的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);
        }
    }

dataUpdater中的run方法有一个whiletrue循环。您从不检查任何退出条件,因此它永远不会停止。您可以做的是在DataUpdater中包含一个volatile标志,最初设置为true,然后让stopConnection将其设置为false。运行中的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);
        }
    }

您可以使用活套,而不是使用占用CPU的while1。 对于回传,您可以将消息回传给回传器中的同一处理程序。 用于在需要时停止,只需将runnable的run方法中的runnable Looper.myLooper.stop发布到Looper


活套比Whiletrue更有效

您可以使用活套,而不是使用while1,因为while1占用CPU。 对于回传,您可以将消息回传给回传器中的同一处理程序。 用于在需要时停止,只需将runnable的run方法中的runnable Looper.myLooper.stop发布到Looper


Looper比Whiletrue更有效

使用runOnUiThread而不是创建处理程序怎么样?使用runOnUiThread而不是创建处理程序怎么样?这毕竟很简单:谢谢!我用dataRefreshHandler.getLooper.quit with Looper打破了我的头脑,但不知何故,bombedI无法通过设置建议的标志让处理程序重新启动更新进程:一旦停止,while循环终止,因为run返回,线程终止。要重新启动它,您需要通过thread.start重新启动一个新线程。如果您正在重用同一个DataUpdater实例,请不要忘记将标志设置回true。。。例如,您可以在run方法的第一行执行此操作。您的意思是在onResume上重新启动线程?我尝试在这里重新启动线程,但不幸的是onResume导致了一种奇怪的行为,在我有多个线程:是的,您需要在onResume中启动线程,但不要忘记onResume是在onCreate之后调用的,因此如果您在onResume中启动线程,请不要在onCreate中启动一个线程,否则您将有2个线程。看看我刚才对我的答案所做的修改。那毕竟是微不足道的:谢谢!我用dataRefreshHandler.getLooper.quit with Looper打破了我的头脑,但不知何故,bombedI无法通过设置建议的标志让处理程序重新启动更新进程:一旦停止,while循环终止,因为run返回,线程终止。要重新启动它,您需要通过thread.start重新启动一个新线程。如果您正在重用同一个DataUpdater实例,请不要忘记将标志设置回true。。。例如,您可以在run方法的第一行执行此操作。您的意思是在onResume上重新启动线程?我尝试在这里重新启动线程,但不幸的是onResume导致了一种奇怪的行为,在我有多个线程:是的,您需要在onResume中启动线程,但不要忘记onResume是在onCreate之后调用的,因此如果您在onResume中启动线程,请不要在onCreate中启动一个线程,否则您将有2个线程。看看我刚才对答案所做的编辑;this.dataRefreshHandler=处理程序;Looper.loop;它崩溃了:当我尝试:Looper.prepare;this.dataRefreshHandler=处理程序;Looper.loop;它崩溃了: