android中Handle类的用法

摘要:
Android中Handle类的用法当我们处理下载或其他需要长时间执行的任务时,如果我们直接将处理函数放入活动的OnCreate或OnStart中,整个活动在执行过程中不会响应。如果时间太长,程序将挂断。处理程序将这些函数放入单独的线程中执行,这不会影响活动。处理程序用于线程之间的消息传输和异步处理。
android中Handle类的用法

    当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。

    当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

以下模拟一个简单的相册查看器,每隔2秒自动更换下一张照片。

main.xml布局文件

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="http://t.zoukankan.com/@drawable/p1"
android:gravity="center" />
</LinearLayout>
复制代码

HandleActivity类

复制代码
package com.ljq.handle;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

public class HandleActivity extends Activity {
private ImageView imageView = null;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
imageView.setImageResource(R.drawable.p1);
break;
case 1:
imageView.setImageResource(R.drawable.p2);
break;
case 2:
imageView.setImageResource(R.drawable.p3);
break;
case 3:
imageView.setImageResource(R.drawable.p4);
break;
}
super.handleMessage(msg);
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

imageView = (ImageView) findViewById(R.id.imageView);
thread.start();
}

int what = 0;
Thread thread = new Thread(new Runnable() {

public void run() {
while (true) {
handler.sendEmptyMessage((what++) % 4);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
});

}
复制代码

运行结果

android中Handle类的用法第5张

免责声明:文章转载自《android中Handle类的用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAR包中读取资源文件FTP服务(2)实现基于SSL的FTPS下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。

无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。 【以上问题待解决】 临时解决方案:暂时先避免...

线程池阻塞队列之LinkedBlockingQueue

LinkedBlockingQueue介绍 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。 此外,LinkedBlockingQueue可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。 LinkedBloc...

4.0中的并行计算和多线程详解(一)

  并行计算部分   沿用微软的写法,System.Threading.Tasks.::.Parallel类,提供对并行循环和区域的支持。 我们会用到的方法有For,ForEach,Invoke。   一、简单使用   首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环) Code             Pr...

.NET应用程序7种最常见的性能问题及其解决方案

译者注:这篇文章依然是介绍.NET Framework框架下的性能问题排查,可能并不直接适用于.NET Core,但有时也能提供一些参考。   .NET应用程序7种最常见的性能问题及其解决方案 原文地址:https://www.eginnovations.com/blog/top-7-net-application-performance-problems...

VC++开发垃圾文件清理软件(上)

VC++开发垃圾文件清理软件(上)     转自:http://www.cnblogs.com/JczmDeveloper/archive/2013/03/22/2974716.html   去年年底那会写了个很简单的垃圾文件清理器,现在简要分享下吧,由于本人初学者,望大家多多指教,先上个图吧:(在各大搜索引擎可以直接搜索到本软件,软件的名称为:小蔡垃...

Servlet 异步处理

web容器会为每个请求分配一个线程,Servlet3.0新增了异步处理,解决多个线程不释放占据内存的问题。可以先释放容器分配给请求的线程与相关资源,减轻系统负担,原先释放了容器所分配线程的请求,其响应将被延后,可以在处理完成后再对客户端进行响应。 一、AsyncContex简介     为了支持异步处理,在ServletRequest上提供了startAs...