在这里我要实现的是,一个输入框,一边输入一边将它内容的大写展示在下面(不同一般的是,转化成大写的工作在工作线程中完成);
TextWatcher监听EditText的内容的变化,当内容变化时,将内容发送到工作线程,工作线程将其转化成大写的之后,重新发送到主线程,并在主线程中完成界面更新!
代码:
package com.example.getmynumber.thread;
import com.example.getmynumber.R;
import com.example.getmynumber.util.StringUtil;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
/**
* 实现主线程,向工作线程发送消息,
* 工作线程将用户输入的字符串转化成大写
* 然后给主线程发送消息跟新界面
* @author Administrator
*
*/
public class WorkThreadTest extends Activity{
private Looper workerLooper;
private Handler workerHandler;
//主线程的handler,完成界面更新</span>
private Handler mainHandler=new Handler(Looper.getMainLooper()){
public void handleMessage(android.os.Message msg) {
String str=(String) msg.obj;
tv_show.setText(str);
};
};
private EditText et_shuru;
private TextView tv_show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_workthread);
initView();
registerListener();
}
private void initView() {
et_shuru=(EditText) findViewById(R.id.et_shuru);
tv_show=(TextView) findViewById(R.id.tv_show);
}
private void registerListener() {
Thread t=new Thread(){
@Override
public void run() {
super.run();
Log.i("wangsongbin", "runing....1");
Looper.prepare();
//获得当前线程的迭代器对象
workerLooper =Looper.myLooper();
Log.i("wangsongbin", "runing....2");
workerHandler=new WorkHandler(workerLooper);//根据workerLooper初始化工作线程的handler对象
Log.i("wangsongbin", ""+workerHandler);
//启动迭代器
Looper.loop();
}
};
t.start();
//为EditText绑定内容变化的动态监听
et_shuru.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(StringUtil.isNullOrEmpty(s.toString().trim())){
tv_show.setText("");
return;
}
if(workerHandler!=null){
Message msg=workerHandler.obtainMessage();//向工作线程发送消息
msg.obj=s.toString().trim();
workerHandler.sendMessage(msg);
Log.i("wangsongbin", s.toString().trim()+"mian");
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
class WorkHandler extends Handler{
public WorkHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("wangsongbin", "workHandler");
Message mmsg=mainHandler.obtainMessage();
String str=(String) msg.obj;
mmsg.obj=str.toUpperCase();
mainHandler.sendMessage(mmsg);//向主线程发送消息
Log.i("wangsongbin", str.toUpperCase()+"work");
//第二种方法
/* final String str2=str.toUpperCase();
mainHandlerh.post(new Runnable() {
@Override
public void run() {
//此方法运行在哪个线程取决于handler
//所在的线程
tv_show.setText(str2);
}
});
}
*/
}
}
}
注意,Handler handler=new Handler();
如果构造方法没有指定Looper对象,那么handler会是默认为创建它的线程的handler对象。
Android中有HandlerThread 这是封装了消息循环机制的线程!