HandlerThread的简单使用

这里只是写了个HandlerThread的简单栗子,什么也不多说。
以后有时间再说一下原理什么的。

package com.audienl.test;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.support.annotation.AnyThread;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import java.lang.ref.WeakReference;
import java.util.Random;

public class HandlerThreadActivity extends AppCompatActivity {
    private static final String TAG = "HandlerThreadActivity";
    private TextView mTvShow;

    private Handler mHandler = new Handler();// UI线程的Handler
    private HandlerThread mHandlerThread;
    private HandlerThreadHandler mHandlerThreadHandler;// HandlerThread的Handler
    private boolean isUpdate = false;

    public static void start(Context context) {
        Intent starter = new Intent(context, HandlerThreadActivity.class);
        context.startActivity(starter);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handle_thread);

        mTvShow = (TextView) findViewById(R.id.tv_show);

        // 创建工作线程,并初始化其Handler。注意:一定要是线程start之后,因为Looper.prepare()在run方法里面。
        mHandlerThread = new HandlerThread("update");
        mHandlerThread.start();
        mHandlerThreadHandler = new HandlerThreadHandler(mHandlerThread.getLooper(), this);
    }

    /**
     * 更新界面
     */
    @AnyThread
    private void update(int num) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                mTvShow.setText(String.valueOf(num));
                Log.i(TAG, "Update: " + num);
            }
        });
    }

    /**
     * 使用静态内部类,以及弱引用,避免内存泄漏。
     */
    private final static class HandlerThreadHandler extends Handler {
        private WeakReference mActivity;

        public HandlerThreadHandler(Looper looper, HandlerThreadActivity activity) {
            super(looper);
            mActivity = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            HandlerThreadActivity activity = mActivity.get();
            if (activity != null) {
                if (activity.isUpdate) {
                    activity.update(new Random().nextInt());

                    SystemClock.sleep(2000);
                    if (activity.mHandlerThreadHandler != null) {
                        activity.mHandlerThreadHandler.sendEmptyMessage(0);
                    }
                }
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        isUpdate = true;
        mHandlerThreadHandler.sendEmptyMessage(0);
    }

    @Override
    protected void onStop() {
        super.onStop();
        isUpdate = false;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandlerThread.quit();
        mHandlerThreadHandler = null;
    }
}

你可能感兴趣的:(HandlerThread的简单使用)