作用,解决痛点
handler 在子线程中使用需要的步骤:在这里附上一篇handler 原理介绍
在run方法中:
Looper.prepare();
// 在这里进行handler的声明以及绑定looper.
Looper.loop();
handlerThread 继承自Thread,也是一个线程。 它在run方法中已经为我们写好了。 具体看一下源码:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
这时候,我们只要了解handler的原理,那么。将handlerThread的looper绑定到新声明的handler身上,然后重写handleMessage方法就能对handler所send得message进行就收以及处理。
同时,在源码之中还添加了退出消息循环的方法,quit(),更加方便了handler的管理.
具体看看代码
package com.example.disignmode.handlertest;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import com.example.haodong.common.util.LogUtil;
/**
* describe :
* date on 2019/4/29
* author linghailong
* email 105354999@qq.com
*/
public class DownLoadHandlerThread extends HandlerThread implements Handler.Callback{
public static final int START_DOWNLOAD=0X01;
public static final int UPDATE_UI=0X02;
private Handler mUIHandler;
public void setmUIHandler(Handler mUIHandler) {
this.mUIHandler = mUIHandler;
}
public DownLoadHandlerThread(String name) {
super(name);
}
@Override
public boolean handleMessage(Message msg) {
if (msg == null) {
return false;
}
switch (msg.what){
case START_DOWNLOAD:
try {
LogUtil.i("current thread"+Thread.currentThread().getName());
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mUIHandler!=null){
Message uiMsg=mUIHandler.obtainMessage();
uiMsg.what=UPDATE_UI;
String s ="下载完毕";
uiMsg.obj=s;
mUIHandler.sendMessage(uiMsg);
}
break;
}
return true;
}
}
mainActivity中的例子:
package com.example.disignmode.handlertest;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.disignmode.R;
import com.example.haodong.common.util.LogUtil;
import java.lang.ref.WeakReference;
public class Handler1Activity extends AppCompatActivity {
// MyHandler<Handler1Activity> myHandler = new MyHandler<>(Looper.getMainLooper());
private Handler mWorkHandler, mUiHandler;
private DownLoadHandlerThread downLoadHandlerThread;
private TextView mTvShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler1);
mTvShow = findViewById(R.id.handler1_tv);
mUiHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DownLoadHandlerThread.UPDATE_UI:
String str = (String) msg.obj;
LogUtil.i(Thread.currentThread().getName());
mTvShow.setText(str);
downLoadHandlerThread.quitSafely(); // 仅仅示范方法使用。
}
}
};
downLoadHandlerThread = new DownLoadHandlerThread("work thread"); // 声明thread
downLoadHandlerThread.start(); // 和别的thread一样。需要调用start
downLoadHandlerThread.setmUIHandler(mUiHandler);
mWorkHandler=new Handler(downLoadHandlerThread.getLooper(),downLoadHandlerThread); // 对工作线程绑定looper 以及handler.callback
Message message =Message.obtain();
message.what=DownLoadHandlerThread.START_DOWNLOAD;
mWorkHandler.sendMessage(message); //发送消息
}
}