package com.com.mr_wrong.HandlerThread; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.example.mr_wrong.androidstudioproject.R; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by Mr_Wrong on 15/10/7. */ public class HandlerThreadActivity extends AppCompatActivity { @InjectView(R.id.handlerThreadBtn) Button handlerThreadBtn; private TextView mTvServiceInfo; private HandlerThread mCheckMsgThread; private Handler mCheckMsgHandler; private boolean isUpdateInfo; private static final int MSG_UPDATE_INFO = 0x110; //与UI线程管理的handler private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { String result = "实时更新中,当前大盘指数:<font color='red'>%d</font>"; result = String.format(result, (int) (Math.random() * 3000 + 1000)); mTvServiceInfo.setText(Html.fromHtml(result)); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlerthread); ButterKnife.inject(this); //创建后台线程 initBackThread(); mTvServiceInfo = (TextView) findViewById(R.id.text_handlethread); handlerThreadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO); } }); } @Override protected void onResume() { super.onResume(); //开始查询 isUpdateInfo = true; mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO); } @Override protected void onPause() { super.onPause(); //停止查询 isUpdateInfo = false; mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO); } private void initBackThread() { mCheckMsgThread = new HandlerThread("check-message-coming"); mCheckMsgThread.start(); mCheckMsgHandler = new Handler(mCheckMsgThread.getLooper()) { /* 这个是子线程的handler 通过mCheckMsgThread.getLooper()和子线程的messagequeue进行绑定 这个可以当做是子线程的run使用 其实就是省略了在子线程中的 Looper.prepare();和 Looper.loop();这个句话 对于handler 发送一个message 进入handler当前的queue 同时设置target是自己 loop进行无限的循环 回调msg.target.dispathmessage进行message的分发 对于handler的dispathmessage方法,如果有callback就 去处理。没有的话就是我们自己处理handlemessage了*/ @Override public void handleMessage(Message msg) { //模拟耗时 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendEmptyMessage(1); if (isUpdateInfo) { mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000); } } }; } @Override protected void onDestroy() { super.onDestroy(); //释放资源 mCheckMsgThread.quit(); } }