今天看到了Android 多线程,以及异步消息处理机制,这里做一下简单的总结。
一、Android多线程的基本用法--Thread类
这里有两种方法.:
方法一: 新建一个类,继承自 Thread
class mythread extends Thread {
@Override
public void run() {
while (true) {
Log.e("TTTTTTTTTTT", System.currentTimeMillis() + "");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
方法二: 实现Runable接口
class mythread implements Runnable {
@Override
public void run() {
while (true) {
Log.e("ttttttttttttt", System.currentTimeMillis() + "");
}
}
}
开始这个线程:new Thread(new mythread()).start()
二、Android 异步消息处理机制 Handler, Message
Android的UI 操作只能在主线程里操作, 举个简单的例子,如果你想在子线程里面TextView.setText(), 应用肯定会报错的。如何处理? 这里引出了handler机制。
简单流程:
1. 子线程里进行逻辑运算,然后创建一个Message 对象, 给message.what 复制,调用handler.sendMessage()方法。
Message message = new Message();
message.what = 1
handler.sendMessage();
2. handler 处理Message, 因为hander 是在主线程里运行,这里就可以更新UI了,例如setText()
Handler handler = new Handler(new Handler.Callback(){
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 1) {
tvDisplay.setText("Good good play, Hard hard study");
}
return true;
}
});
class mythread extends Thread {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}
public void onClick(View v) {
new mythread().start();
}
三、 使用AsyncTask 处理异步消息
如何需要更新UI, 在doInBackground(){...} 方法中 publishProgress(), 在onProgressUpate()中更新UI。
public class DemoAsyncTask extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo_async_task);
Button btcClick = (Button) findViewById(R.id.btnClick);
tv = (TextView) findViewById(R.id.tv);
btcClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new update().execute();
}
});
}
class update extends AsyncTask<Void, Void,Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
publishProgress();
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
tv.setText("Nice to meet you ");
}
}
}