HandlerThread怎么更新ui,我试了很多方法,都不能更新ui,求大神们指导一下
HandlerThread handlerThread = new HandlerThread(getMainLooper().toString());
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message message = myHandler.obtainMessage();
message.sendToTarget();
public class MyHandler extends Handler {
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
在handleMessage(Message msg)方法里怎么不能更新ui
handler.send(Message message),或者handler.post (Runnable r);
2.View.post(Runnable r);
/**
*/
class ViewPostThread extends Thread{
@Override
public void run() {
super.run();
while(count<101){
/**
* view.post(Runnable)
*/
bar.post(new Runnable() {
@Override
public void run() {
isChanging = true;
bar.setProgress(count);
count++;
}});
/**
* view.postDelayed(Runnable,delayTime)
*/
// bar.postDelayed(new Runnable() {
//
// @Override
// public void run() {
// isChanging = true;
// bar.setProgress(count);
// count++;
//
// }},100);
//
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
3.Activity的RunOnUIThread(Runnable r);
class ViewPostThread extends Thread{
@Override
public void run() {
super.run();
while(count<101){
runOnUiThread(new Runnable() {
@Override
public void run() {
isChanging = true;
bar.setProgress(count);
count++;
}});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
4.通过HandlerThread进行更新
/**
*/
private HandlerThread handlerThread =new HandlerThread("handler_thread"){
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
count++;
bar.setProgress(count);
if(count==100){
Toast.makeText(HandlerThreadTest.this, "Done", 1).show();
}
};
};
使用时候调用
handlerThread.start();
5.在子线程中更新,前提是得Loop.prepare( );
/**
*/
class NormalThread extends Thread{
private int count=0;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
count++;
bar.setProgress(count);
};};
@Override
public void run() {
super.run();
Looper.prepare();
while(count<=100){
handler.sendEmptyMessage(0);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Looper.loop();
}
}
了解下Android的Handler机制,你就知道怎么更新ui了。
你的handler绑定的是你自己的handlerthread而不是ui线程。mhandler = new Handler(Looper.getMainLoop())即可
最简单都更新UI的方式
1.先开个子线程做耗时的操作
new Thread(new Runnable() {
@Override
public void run() {
//子线程里面做可以一些耗时的操作
for (int i = 0; i < 100; i++) {
String arr = "你好"+i;
}
//更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
//这里可以直接更新UI了。方便
}
});
}
}).start();
其实说白了,最终还是通过Handler去更新UI界面
了解下原理就明白了:http://www.cnblogs.com/menlsh/archive/2013/06/07/3125341.html
看看是不是在主线程,因为这要在主线程创建才有效。