0%

Android开发 多线程开发 HandlerThread

通过查看HandlerThread,可以知道,本质上,它就是一个Thread,只不过多了一个Looper,可以跟UI线程一样,通过Handler,发送消息在后台线程中执行任务。示例代码:

package com.pocketdigi.handlerthread;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemClock;
import android.widget.TextView;

public class MainActivity extends Activity {
    TextView textView;
    Handler mBackgroundHandler, mUiHandler;
    //destory标记
    boolean mDestoryed=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        //实例化一个HandlerThread,参数为name,可随意
        HandlerThread thread = new HandlerThread("handlerThread");
        //必须马上start();
        thread.start();
        //通过HandlerThread的looper,实例化一个handler,这个handler发送的消息都由HandlerThread处理
        mBackgroundHandler = new Handler(thread.getLooper());
        //无参数,默认是当前线程的handler,即UiThread
        mUiHandler = new Handler();

        mBackgroundHandler.post(new Runnable() {

            @Override
            public void run() {
                // 后台线程执行
                for (int i = 0; i < 100&&!mDestoryed; i++) {
                    SystemClock.sleep(1000);
                    System.out.println(i);
                    final int finali = i;
                    mUiHandler.post(new Runnable() {
                        //UI线程执行
                        @Override
                        public void run() {
                            // TODO 自动生成的方法存根
                            textView.setText(String.valueOf(finali));
                        }
                    });
                }

            }
        });

    }

    @Override
    protected void onDestroy() {
        // TODO 自动生成的方法存根
        super.onDestroy();
        //标记activity已关闭
        mDestoryed=true;
         //最后让looper执行quit,否则一直在循环,HandlerThread就不会终止
        mBackgroundHandler.getLooper().quit();
    }
}