Android多线程,异步消息处理机制, Thread, AsyncTask 简单总结
2015-11-06 15:25
706 查看
今天看到了Android 多线程,以及异步消息处理机制,这里做一下简单的总结。
方法一: 新建一个类,继承自 Thread
开始这个线程: new mythread().start()
方法二: 实现Runable接口
开始这个线程:new Thread(new mythread()).start()
简单流程:
1. 子线程里进行逻辑运算,然后创建一个Message 对象, 给message.what 复制,调用handler.sendMessage()方法。
Message message = new Message();
message.what = 1
handler.sendMessage();
2. handler 处理Message, 因为hander 是在主线程里运行,这里就可以更新UI了,例如setText()
比如用button来激活这个线程
一、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 "); } } }
相关文章推荐
- java-模拟tomcat服务器
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- ruby实现的一个异步文件下载HttpServer实例
- C#异步绑定数据实现方法
- C#线程间不能调用剪切板的解决方法
- 浅谈chuck-lua中的多线程
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例
- C#线程队列用法实例分析
- C#中异步回调函数用法实例
- 基于一个应用程序多线程误用的分析详解