Android日记Android 面试专辑Android高级开发面试题

Android经典面试题分析(2017)

2017-08-15  本文已影响178人  酱爆大头菜

转载请注明出处:http://blog.csdn.net/w525721508/article/details/77198233


synchronized函数和synchronized代码块的区别



如何判断一个对象是可以被回收的



写一个函数,输入一个数如38,拆分 3 + 8 = 11,1 + 1 = 2,最后2无法拆分就返回

    public  int  getNum(int num) {
        while (num >= 10) {
            num = num / 10 + num % 10;
        }
        return num;
    }


多个进程同时调用一个ContentProvider的query获取数据,ContentPrvoider是如何反应的呢?

我们知道Activity这样的组件,它生命周期的回调函数是在UI线程中执行的,ContentProvider的onCreate()方法也是在UI线程中运行的,回答这个问题前,我们首先要搞清楚ContentProvider的Query(),insert(),delete(),updata()这几个方法是否也是在UI线程中运行。

如果以上几个方法是在UI线程中运行的,那么多个线程并发去调用就很有可能出现ANR;如果不是在UI线程运行的,那它是在一个工作线程中运行的还是在多个线程中运行的呢?即ContentProvider是否支持并发操作呢?

ContentResolver与ContentProvider类隐藏了实现细节,但是ContentProvider所提供的Query(),insert(),delete(),updata()这几个方法都是在ContentProvider进行的线程池中运行的,而不是在进程的主线程中运行,以为这些方法有可能被多个地方调用,所以它们是线程安全的。
ContentProvider实现进程通信是依赖于Binder机制的,所以以上问题会回归到Binder线程处理问题,并不是每一个ContentProvider都会有一个线程池,而是一个进程共用一个线程池,共用的线程池就是Binder线程池。

一个content provider可以接受来自另外一个进程的数据请求。尽管ContentResolver与ContentProvider类隐藏了实现细节,但是ContentProvider所提供的query(),insert(),delete(),update()都是在ContentProvider进程的线程池中被调用执行的,而不是进程的主线程中。这个线程池是有Binder创建和维护的,其实使用的就是每个应用进程中的Binder线程池。



Android设计ContentProvider的目的是什么?



运行在主线程的ContentProvider为什么不会影响主线程的UI操作?

上一篇下一篇

猜你喜欢

热点阅读