android耗时操作
❶ Android的handler机制的原理
Android的handler机制的原理分为异步通信准备,消息发送,消息循环,消息处理。
1、异步通信准备
在主线程中创建处理器对象(Looper)、消息队列对象(Message Queue)和Handler对象。
2、消息入队
工作线程通过Handler发送消息(Message) 到消息队列(Message Queue)中。
3、消息循环
消息出队: Looper循环取出消息队列(Message Queue) 中的的消息(Message)。
消息分发: Looper将取出的消息 (Message) 发送给创建该消息的处理者(Handler)。
4、消息处理
处理者(Handler) 接收处理器(Looper) 发送过来的消息(Message),根据消息(Message) 进行U操作。
handler的作用
handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。
Handler的运行需要底层的 messagequeue和 looper做支撑。
❷ android list集合中多个耗时操作如何执行
不用for循环,用递归调用,异步任务结束时调用自己就行
❸ android service可以进行耗时操作吗
不可以的。android 开发中, 主线程都不可以写耗时操作, 不管是application activity 还是service, 如果在主线程中写了耗时操作,很容易引起ANR, 应用程序无响应. 耗时操作应该用子线程处理.
❹ android 耗时操作放在哪
ndroid手机应用开发中,耗时操作有:
下载文件操作2.网络连接操作(尤其是网络不好的时候)3.音频格式转换操作4.文件操作5.比较大的数据的初始化操作6.sleep函数等
❺ android application里能不能写耗时操作
android application当然不能写耗时操作,因为应用一开始就会执行application里面的语句
❻ android中如何处理耗时操作,asyncTask有什么不足之处
耗时操作处理:放到异步线程中进行操作。
Asynctask的不足之处:
1.AsyncTask可能存在新开大量线程消耗系统资源和导致应用FC的风险
2.AsyncTask一旦执行了 doInBackground,就算调用取消方法,也会将doInBackground里面的代码执行完毕,才会停止。
3.线程池不经维护,当大量异步发生时,导致线程池满了,会出异常。
❼ android哪些操作是耗时操作
耗时操作主要有下载文件操作,网络连接操作(尤其是网络不好的时候)音频格式转换操作,文件操作,比较大的数据的初始化操作,sleep函数等,
你说的传感器的状态监听操作,仅仅是注册了一个函数到framework层去,下层在收到传感器的消息后会调用你注册的这个函数,这个并不是什么耗时的操作。
❽ android平台的音乐播放器,播放音乐(这应该是一个很耗时的操作)能不能在子线程中实现
Android平台实现音乐播放器,如果单单将播放音乐的操作放在子线程中进行会有一些问题:
Thread所在的Activity优先级低,容易被系统杀死。如果程序在后台,Thread所在的Activity很可能因为内存不足被系统杀死。(音乐播放器常常会在后台运行,因为用户往往在听歌时会浏览其他应用。)
如果在播放音乐时需要更新Activity的UI界面,单单运用Thread会播出异常。
参考思路:可以将播放音乐的操作放在Service中进行,如果需要更新UI,可以使用Hanlder与Activity建立通信。
❾ 如何优化 android 系统应用的启动速度
一、应用的启动
启动方式
通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。
1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。
- adb shell am start -W [packageName]/[packageName.MainActivity]
特点
1、冷启动:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
2、热启动:热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。
上面说的启动是点击app的启动图标来启动的,而另外一种方式是进入最近使用的列表界面来启动应用,这种不应该叫启动,应该叫恢复。
二、应用启动的流程
在安卓系统上,应用在没有进程的情况下,应用的启动都是这样一个流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。
所以,总结一下,应用的启动流程如下:
Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
三、测量应用启动的时间
在上面这个启动流程中,任何一个地方有耗时操作都会拖慢我们应用的启动速度,而应用启动时间是用毫秒度量的,对于毫秒级别的快慢度量我们还是需要去精确的测量到到底应用启动花了多少时间,而根据这个时间来做衡量。
什么才是应用的启动时间
从点击应用的启动图标开始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。
我们要测量的也就是这段时间,测量这段时间可以通过adb shell命令的方式进行测量,这种方法测量的最为精确,命令为:
执行成功后将返回三个测量到的时间:
1、ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
2、TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
3、WaitTime:一般比TotalTime大点,包括系统影响的耗时。
下面是测量一个应用冷启动和热启动的时间:
冷启动:
热启动:
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。
❿ android 耗时操作怎么处理
handler其实就是消息处理机制。首先在主线程也就是UI创建一个Handler对象,复写其中的handMessage( Message msg)方法。该方法里的msg就是子线程发来的消息,表示子线程处理完了,以这个msg来通知主线程。让主线程来作UI的绘制工作。
那么子线程工作完了就要发消息了,比如:
run(){
data = getDataFromInternet();//耗时工作
Message msg = handler.obtainMessage(0, data);//通过handler得到消息,该消息的标识为0,消息内容是data
handler.sendMessage(msg);//发送
}
然后handler在主线程就负责接收:
public Handler handler = new Handler(){//处理UI绘制
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
data = (List<Map<String, Object>>) msg.obj;
if(data == null){
Toast.makeText(AllMovieActivity.this, "网络连接失败,获取不到影片信息", 1).show();
}else {
adapter = new HotMoviedapter(AllMovieActivity.this, data, R.layout.allmovielist_item,
new String[] { "picurl", "chname", "director", "leadrole",
"fshowtime", "country" }, new int[] { R.id.picurl,
R.id.chname, R.id.director, R.id.leadrole,
R.id.fshowtime, R.id.country },mListView);
TextView v = new TextView(AllMovieActivity.this);
v.setHeight(80);
v.setSelectAllOnFocus(false);
mListView.addFooterView(v);
mListView.setAdapter(adapter);
}
break;
default:
break;
}
}
};