AsyncTask与handler优缺点
AsyncTask实现的原理和适用的优缺点
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
简单,快捷,过程可控
使用的缺点:
在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
AsyncTask内部的实现机制是运用了ThreadPoolExcutor,应用程序无法控制,如果将AsyncTask做为内部类,容易出现内存泄漏,建议1:将线程的内部类改为静态内部类,2:线程内部使用弱引用保存context的引用。
Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成Message-Looper获取Message并传递给HandlerHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点:
结构清晰,功能定义明确
对于多个后台任务时,简单,清晰
使用的缺点:
在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
2、Looper,Message,Handler
1、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。
Activity启动模式:
Standard
SingleTop:不允许多个相同Activity实例叠加,就是如果要启动的Activity在栈顶,再次启动该Activity不会创建实例,而会调用其onNewIntent()方法
SingleTask:只有一个实例,在同一应用程序中启动它的时候,若其不存在,就在当前task创建新的实例,若存在就会把task中在其之上的其他Activity destroy掉并调用它的onNewIntent()方法
SingleInstance:只有一个实例,并且这个实例独立运行在一个task栈中
广播的两种注册方式和区别
1、 代码中动态注册
先自定义广播接受者,实例化意图过滤器,使用contextregisterReceiver (BroadcastReceiver,IntentFilter, String, Handler)方法注册广播,生命周期随注册开始程序结束而结束
2、配置文件注册(静态注册):
生命周期从安装程序开始,现在从第一次启动开始,到应用卸载结束。
广播发送的两种方式:有序无序
通过mContext.sendBroadcast(Intent)或mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限); 无序广播:所有的接收者都会接受时间,不可被拦截,不可被修改
通过mContext.sendOrderedBroadcast(Intent, String,BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。有序广播:按照优先级,一级一级乡下传递,接收者可以修改广播数据,也可以终止,配置文件中设置<intent-filter android:priority=”1000”>优先级
例:
Intent intent =new Intent();
Intent.setAction(“com.example.broadcast”);
/**参数:1、intent 2、String类型的接收者权限 3、指定接受者 4、handler scheduler 5、int此次广播的标记 6、String初始数据 7、bundle往Intent中添加的额外数据**/
sendOrderBroadcast(intent,null,null,null,”初始数据”),
在接收者中setResultExtras(bundle),可以修改接收到的bundle数据(可以添加修改)传到下个接收者那里。abortBroadcast();是切断广播,不再往下传递
OOM原因及处理方式:
1、大量使用static,使一些资源无法释放,尽量使用applicationcontext
2、Bitmap:加载大量图片,
处理:(1)及时销毁recycle 回收后设置null,(2)加载图片时用采样率压缩,防止大图片,过程中要采用流处理。(3)运用软引用SoftRefrence
3、未关闭流InputStream/OutputStream
4、Activity注册广播后未调用注销
5、Adapter没有使用缓存convertView;
6、数据库查询没有关闭cursor,cursorAdapter中不能直接关闭掉,需要在ondestory中关闭
Thread和Runnable:
集成thread,重写run()方法,启动需执行start();
实现Runnable,重写run()方法
Java单继承多实现,尽量使用runnable
Runnable子类可以通过Thread来启动,多线程共享资源
package org.demo.runnable;
class MyThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
}
package org.demo.runnable;
public class RunnableTicket {
public static void main(String[] args) {
MyThread mt=new MyThread();
new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
new Thread(mt).start();//个实例化对象mt,就会出现异常
new Thread(mt).start();
}
};
Thread也是runnable接口的子类
Service两种启动方式的区别
startService():开启服务,调用stopService()或Service自己调用stopSelfResult()才停止服务,不管调用几次startService(),只需一次stopService就可以停止服务
bindService():
start开启,调用者与服务没有关联,即使调用者退出,服务仍运行,使用bindService()开启服务,调用者退出服务也终止。
startService()启动服务,oncreate()—onstart();多次调用只会调用一次oncreate(),多次调用onstart();
bindService()启动服务,服务未创建时,oncreate()—onbind();这时已经与调用者绑定在一起,调用者退出,系统会先调onunbind(),接着销毁ondestory();
如果绑定之前服务已启动,只调onbind(),绑定后的服务执行stopService(),服务不会执行ondestory(),如果必须停止需先unbindService()在stopservice();
bindService(),可以让activity能够访问到service里面的方法
IntentintentService = new Intent(this,MyService.class);
bindService(intentService,newMyConn(),BIND_AUTO_CREATE);
ServiceConnection对象 绑定创建服务
//回调连接状态
Private class MyConn implementsServiceConnection{
Publicvoid onServiceConnected(ComponentName name,IBinder service){
//IBinder对象可以调用service中的方法myFunction
LocalBinder binder = service;
mService = binder.getService();
mservice.myFunction();
}
Publicvoid onServiceDisConnected(ComponentName name){
}
}
//service
Public class MyService extends Service{
Privatefinal IBinder mBinder = new LocalBinder();
PublicIBinder onBind(Intent intent){
ReturnmBinder;
}
Publicint myFunction(){
}
Publicclass LocalBinder extends Binder{
MyService getService(){
Return MyService.this;
}
}
}