Handler
异步消息处理机制的使用方法:
public class MainActivity extends AppCompatActivity {
public static final int UPDATE_TEXT=1;
private TextView mcontent;
private static String string;
private static final String TAG = "MainActivity";
private final OkHttpClient mclient=new OkHttpClient();
@SuppressLint("HandlerLeak")
private Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case UPDATE_TEXT:
mcontent.setText(string);
}
super.handleMessage(msg);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcontent = (TextView) findViewById(R.id.tvContent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actions,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menGet:
new Thread(new Runnable() {
@Override
public void run() {
get();
Message message=new Message();
message.what=UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
break;
}
return super.onOptionsItemSelected(item);
}
private void get()
{
Request.Builder builder=new Request.Builder();
builder.url("https://github.com/square/okhttp/blob/master/README.md");
Request request=builder.build();
Log.d(TAG,"run:"+request);
Call call=mclient.newCall(request);
try {
Response response=call.execute();
if(response.isSuccessful())
{
string =response.body().string();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
整形常量UPDATE_TEXT,用于表示更新TextViewde 这个动作,new一个Handler对象,并重写父类的handleMessage()方法,如果发现Message的what字段等于UPDATE_TEXT,就执行UI线程。
在菜单按钮的点击事件中,get()方法使用okhttp对服务器发起get请求,并将response的正文转化成string类型,然后赋值给变量string。然后创建一个message对象,用Handler的sendMessage()将这条message发送出去。很快,Handler收到这条message,并在handleMessage()的方法中进行处理。在这个时候handleMessage()方法中的代码就是在主线程当中运行的了,我们可以在这里进行UI操作。接下来对Message携带的what字段进行判断,如果等于UPDATE_TEXT,TextView的显示内容就会被改变。
Handler的工作原理
-
Message
message是线程之间传递的信息,他可以在内部携带少量的信息,用于在不同线程之间交换数据。what,arg1,arg2都是可以用来携带整型数据的;使用obj字段可以携带Object对象。 -
Handler
Handler是用来发送和处理消息的。发送消息使用Handler的sendMessage()方法,发出的消息处理之后,最终会传递到Handler的handleMessage()方法中。 -
MessageQueue
MessageQueue是消息队列,它用于存放所有通过Handler发送的消息。这部分消息一直存在于消息队列当中,等待被处理,每个线程只会有一个MessageQueue对象。 -
Looper
Loopper是每个线程 MessageQueue的管家,调用Looper的loop()方法之后,就会进入一个无限的循环当中,如果MessageQueue中存在一条信息,就会将他取出来,并传递给Handler的handleMessage()方法中,每个线程也只有一个Looper对象