您的位置:首页 > 移动开发 > Android开发

Android多线程,异步消息处理机制, Thread, AsyncTask 简单总结

2015-11-06 15:25 706 查看
今天看到了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();
}
}
}
}


开始这个线程: new mythread().start()

方法二: 实现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);

}
}


比如用button来激活这个线程
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 ");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息