问题记录

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;

}

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值