繁体   English   中英

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

[英]How to stop thread Handler in Android?

我刚开始在Android上使用一个简单的线程处理程序。 代码有效。 唯一的部分是如何关闭处理程序。 我试图关闭处理程序onPause()是徒劳的,但它只是继续运行。 有什么建议么?

这是代码:My Main Activity线程:

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”方法有一个while(true)循环。 你永远不会检查任何退出条件,所以它永远不会停止。 你可以做的是在DataUpdater中包含一个volatile标志(最初设置为true)并让stopConnection将其设置为false。 run while循环可以检查该标志而不是无限循环。

要确保您的活动运行时DataUpdater正在运行:

将调用移至startDataUpdater(); onCreateonResume (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);
        }
    }

您可以使用Looper的用户,而不是使用作为CPU hogger的while(1)。 对于循环,您可以将消息发布回looper中的相同处理程序。 当你想要停止时,只需将runnable的run()方法中的runnable Looper.myLooper.stop()发布到looper。

Looper比While更有效(真实)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM