1.handler主要用于子线程与主线程的消息传递,由于UI线程不能执行耗时操作,所以我将耗时操作放到子线程中去执行,并同Handler机制将子线程获取的消息发送到UI线程中,从而实现UI的线程中控件的内容的实时更新。
2.一般都是子线程向主线程发送消息,那如何实现主线程向子线程发送消息呢?其实我们可以通过下面实例来实现:
public class MainActivity extends AppCompatActivity implements Runnable {
public static final int CODE_RESULT_TEXT = 100000;
public static final int CODE_SEND_MESSAGE = 998;
public static final int CODE_RECEIVE_MESSAGE = 999;
// 聊天线程
private Thread mChatThread;
// 发送Handler,将主线程的消息发送给子线程
private Handler mChatHandler;
private EditText mTextMessage;
//private ArrayAdapter<String> mAdapter;
//private List<String> mMessages;
private List<ChatMessage> mMessages;
private ChatAdapter mAdapter;
private ListView mListView;
//接收子线程发送的消息
private Handler mReceiveHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_RECEIVE_MESSAGE:
int type = msg.arg1;
if (type == CODE_RESULT_TEXT) {
String text = (String) msg.obj;
ChatMessage message = new ChatMessage();
message.setReceived(true);
message.setTime(System.currentTimeMillis());
message.setText(text);
message.setUserName("机器人");
mMessages.add(message);
mAdapter.notifyDataSetChanged();
int count = mAdapter.getCount();
mListView.setSelection(count - 1);
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextMessage = (EditText) findViewById(R.id.txt_message);
mMessages = new ArrayList<>();
mAdapter = new ChatAdapter(this, mMessages);
mListView = (ListView) findViewById(R.id.chat_message_list);
if (mListView != null) {
mListView.setAdapter(mAdapter);
}
mChatThread = new Thread(this);
mChatThread.start();
}
//按钮点击事件
public void btnSend(View view) {
if (mChatHandler != null) {
//将主线程的消息发送给子线程
Message message = mChatHandler.obtainMessage(CODE_SEND_MESSAGE);
String text = mTextMessage.getText().toString();
message.obj = text;
mChatHandler.sendMessage(message);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setReceived(false);
chatMessage.setText(text);
chatMessage.setTime(System.currentTimeMillis());
chatMessage.setUserName("我");
mMessages.add(chatMessage);
mAdapter.notifyDataSetChanged();
int count = mAdapter.getCount();
//设置ListView控件每增加一个item就自动滚动到底部
mListView.setSelection(count - 1);
}
}
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_SEND_MESSAGE:
// 发送数据
JSONObject object = new JSONObject();
try {
object.put("key", "67fef75d8c0924ca1ef377eaa40aa838");
object.put("info", msg.obj.toString());
object.put("loc", "北京市海淀区");
object.put("userid", Build.SERIAL);
byte[] data = HttpUtil.doPostJson("http://www.tuling123.com/openapi/api", object.toString());//使用网络请求的POST请求方式
if (data != null) {
String jsonString = new String(data, "UTF-8");
Log.d("ChatThread", "json string = " + jsonString);
JSONObject jsonObject = new JSONObject(jsonString);
int code = jsonObject.getInt("code");
if (code == CODE_RESULT_TEXT) {
String text = jsonObject.getString("text");
Message message = mReceiveHandler.obtainMessage(CODE_RECEIVE_MESSAGE);
message.obj = text;
message.arg1 = code;
mReceiveHandler.sendMessage(message);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
break;
}
}
};
<span style="white-space:pre"> </span>//通过方式将主线程Handler对象指向子线程的Handler,并将子线程的Handler实例化一个对象,从而获取主线程发送来的消息<span style="white-space:pre"> </span>
mChatHandler = handler;
Looper.loop();
}
}