试题集合安卓面试Android面试大全

Android面试大全(异常处理篇)

2017-03-10  本文已影响966人  fengcz

Android面试大全(四大组件篇)
Android面试大全(性能优化篇)
Android面试大全(异常处理篇)
Android面试大全(开源框架篇)
Android面试大全(网络篇)
Android面试大全(java篇)


开发中常见Exception

private final String action ="com.activity.send";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //注册广播,
        // 面试过程中有面试到动态注册广播时,需要几个参数,分别是什么
        IntentFilter filter = new IntentFilter();
        filter.addAction(action);
        /**
         * 两个参数 BroadCastreceiver实例,IntentFilter,通常使用的也是这种
         */
        registerReceiver(receiver,filter);
        /**
         * 四个参数:广播接收器实例,IntentFilter,广播权限,Handler
         */
//        registerReceiver(receiver,filter,"android.permission",Handler);
        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送广播
                sendBroadcast(new Intent(action));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁前需要取消广播注册
        unregisterReceiver(receiver);
    }
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(action)){
                //TODO 接收到广播,做出相应处理
                //在此方法中不能创建线程,也不能做太过耗时的操作
                //广播接收器超过10s的操作会ANR(Application Not Response)

            }
        }
    };

网络请求 出错

ANR

Application Not Response,在手机上我们不时会看到程序无响应等字样,这就是在一定时间内为做完某项操作导致程序发生ANR异常

OOM

OutOfMemory,Android的虚拟机是基于寄存器的Dalvik,最大堆大小一般是16M,有的机器为24M。OutOfMemory的错误,通常 是堆内存溢出。对一般手机应用,手机资源是相当有限的,堆内存的上限值只有16M(有的24M)Android的缺 省值是16M(某些机型是24M),而对于普通应用这是不能改的,当应用程序处理大资源的资源,如图片或视频等媒体资源时,数量一多,时间一长,16M的资源很容易耗尽,所以OOM很容易出现。

虽然Java有垃圾回收机制,但也存在内存泄露。如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了。当然java的,内存泄漏和C/C++是不一样的。如果java程序完全结束后,它所有的对象就都不可达了,系统就可以对他们进行垃圾回收,它的内存泄露仅仅限于它本身,而不会影响整个系统的。

C/C++的内存泄露就比较糟糕了,它的内存泄露是系统级,即使C/C++程序退出,它的泄露的内存也无法被系统回收,永远不可用 了,除非重启机器。

Android的一个应用程序的内存泄露对别的应用程序影响不大。为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出的,也就是说每个应用程序都是在属于自己的进程中运行的。 Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启),这是,我们的应用程序就会崩溃,我们就会看到OOM。

引发OOM的原因

解决办法

private ImageView preview;  
    BitmapFactory.Options options = new BitmapFactory.Options();  
    options.inSampleSize = 2;//宽高都为原来的1/2,即图片为原来的1/4
    Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);  
    preview.setImageBitmap(bitmap);  
Cursor cursor = null;  
  try {  
    cursor = ctx.getContentResolver().query(uri,null, null,null,null);  
    if(cursor != null) {  
        cursor.moveToFirst();  
        //do something  
    }  
  } catch (Exception e) {  
    e.printStackTrace();    
  } finally {  
    if (cursor != null) {  
       cursor.close();  
    }  
}   

有一种情况下,我们不能直接将Cursor关闭掉,这就是在CursorAdapter中应用的情况,但是注意,CursorAdapter在Acivity结束时并没有自动的将Cursor关闭掉,因此,你需要在onDestroy函数中,手动关闭cursor。

状态异常

IllegalStateException

正在持续更新中……

上一篇下一篇

猜你喜欢

热点阅读