handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新。
可以用于定时操作和循环操作在某一段时间调用什么方法或什么类
定时操作:
package com.sdCard.test;
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
Handler mHandler ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler();
mHandler.postDelayed(runnable, 10*1000);//该方法是十秒后调用runnable子线程
}
Runnable runnable =new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Runnable Method", 0).show();
}
};
public void onclick(View view){
}
}
循环操作: 就是自己调用自己
package com.sdCard.test;
import java.io.File;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
Handler mHandler ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler();
mHandler.post(runnable);//调用一次runnable
}
protected void onBackPressed() {//当点击返回键的时候调用
mHandler.removeCallbacks(runnable);//关闭线程
}
Runnable runnable =new Runnable() {
@Override
public void run() {
Log.v("liwangjiang", "run Method");
mHandler.postDelayed(runnable, 10*1000);//该方法是十秒后调用一次 就表示自己调用自己
}
};
public void onclick(View view){
}
}
Handler的解决色块和内存溢出
package netease.li.com.wangyiyun.news.fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import netease.li.com.wangyiyun.R;
import netease.li.com.wangyiyun.news.adapter.HotAdapter;
import netease.li.com.wangyiyun.news.bean.Hot;
import netease.li.com.wangyiyun.news.bean.HotDetail;
import netease.li.com.wangyiyun.util.Constant;
import netease.li.com.wangyiyun.util.HttpResponse;
import netease.li.com.wangyiyun.util.HttpUtil;
public class HotFragment extends Fragment{
private ListView mListView;
private MyHandler handler;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.hot_fragment,container,false);
mListView = view.findViewById(R.id.newListViewId);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
handler=new MyHandler(this);
HttpUtil http = HttpUtil.getInstance();
http.getData(Constant.HOT_URL, new HttpResponse<Hot>(Hot.class) {
@Override
public void onError(String msg) {
}
@Override
public void onSuccess(Hot o) {
//在这里是有一个异步线程不能在这里更新UI
//mListView.setAdapter(new HotAdapter(o.getT1348647909107(),getActivity()));
Message message = new Message();
message.obj=o;
handler.sendMessage(message);
}
});
}
private void initHotAdapter(Hot o){
mListView.setAdapter(new HotAdapter(o.getT1348647909107(),getActivity()));
}
class MyHandler extends Handler{
WeakReference<HotFragment> fragment;//设置弱应用
public MyHandler(HotFragment fragment){
this.fragment=new WeakReference<>(fragment);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
HotFragment hot=fragment.get();
if (hot==null){
return;
}
switch (msg.what){
case 0:
Hot o=(Hot) msg.obj;
initHotAdapter(o);
break;
default:
break;
}
}
}
}