1.Android的单线程模型

在android应用程序启动时,Android会同时启动一个对应的主线程Main Thread。主线程主要负责处理UI方面的事件,所以又称UI线程。Android应用程序必须遵守单线程模型原则:androidUI操作不是线程安全的,并且这些操作必须在UI线程中完成。UI线程负责事件监听和绘图处理,因此必须保证UI线程能够随便响应用户,所以那些非常耗时的,必须放到其他线程中处理,如网络连接,数据库读取等操作,否超过一定时间没有响应,则应用程序就会终止。

2、消息队列机制实现

Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android第一次启动时UI线程会默认创建一个关联的消息队列。通过Looper.myLoop()或Looper.getMainLooper()获得。

Handler可以发布或者处理消息或者是一个Runnable的实例。

3.两种实现

3.1Handler实现

获取UI线程创建的looper,looper=Looper.getMainLooper();

在UI线程中创建Handler,并覆盖其处理方法

handler=new Handler(looper){
@Override
public void handleMessage(Message msg) {
text.setText((String)msg.obj+" "+new Date());
}
};

发送消息

Message message=Message.obtain();
message.obj="Forsat";
handler.sendMessage(message);

3.2AsyncTask实现

onPreExecute():该方法将在执行实际的后台操作前被UI线程调用,可以在该方法中做一些准备工作,如界面显示进度条。

doInBackground(Params...):在方法onPreExecute()执行后马上执行,该方法在后台执行,主要负责很耗时的后台计算。

publishProgress():更新实时的任务进度,该方法时抽象方法,必须实现子类

onProgressUpdate(Progress...):在publishPreogress方法被调用后,UI线程调用。

onPostExecute():在doInBackground()之后执行,可以被UI线程调用。

实现的类,只需要调用execute()就执行,可以处理相对复杂的线程通信。

 1 class UpdateTime extends AsyncTask<Void, Integer, Void>{ 2  3         @Override 4         protected void onPreExecute() { 5              6             Toast.makeText(getApplicationContext(), "开始",0).show(); 7         } 8         @Override 9         protected Void doInBackground(Void... params) {10             11             for(int i=5;i>=0;i--)12             {13                 14             publishProgress(i);15              try {16                 Thread.sleep(1000);17             } catch (InterruptedException e) {18                 // TODO Auto-generated catch block19                 e.printStackTrace();20             }21             }22             return null;23         }24         @Override25         protected void onProgressUpdate(Integer... values) {26             Toast.makeText(getApplicationContext(), values[0]+" ",0).show();27         }28         @Override29         protected void onPostExecute(Void result) {30             Toast.makeText(getApplicationContext(), "执行完成",0).show();31             text.setText("执行完成"+new Date());32         }33     }

更多相关文章

  1. Android离线安装方法
  2. Android完美解决输入框EditText隐藏密码打勾显示密码问题
  3. Java和Android(安卓)Http连接程序:使用java.net.URL 下载服务器图
  4. Android中Activity组件详解
  5. Android中的测试小demo
  6. Android(安卓)DVM
  7. 丢失Android系统库或者Conversion to Dalvik format failed with
  8. Android滑动手势侦测方法介绍
  9. Android中SQLite应用详解(很详细)

随机推荐

  1. 如何去使用Python分析股票数据?学到就是赚
  2. 欧洲最大电商 Zalando 的微服务之道
  3. Wireshark分析艺术【读书总结】
  4. OpenTelemetry 简析
  5. 16 个好用的 Code Review 工具
  6. Kubernetes 稳定性保障手册 -- 可观测性
  7. 《我与Windows Server 2008R2那点事儿》
  8. Istio Proxy【Envoy扩展】详解
  9. MySql引擎原理以及优化
  10. js的解构