ContentProvider的各个方法分别运行在哪个线程

一. 参考

1.Which thread runs ContentProvider?
https://stackoverflow.com/questions/3491747/which-thread-runs-contentprovider?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

2.contentprovider和线程以及阻塞
https://blog.csdn.net/changqijihua/article/details/80800207

二.总结

1.当ContentProvider运行与独立进程的时候; onCreate方法运行与该进程的主线程,
其余增删改查等所有方法运行在Binder线程.
2.当ContentProvider运行在调用者同一个进程的时候; onCreate方法运行与该进程的主线程,其余增删改查等所有方法运行在调用时所在的线程.

(一)demo实例:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Uri uri = Uri.parse("content://com.test.bookprovider.BookContentProvider");
        getContentResolver().query(uri, null, null, null, null);
        getContentResolver().query(uri, null, null, null, null);
        getContentResolver().query(uri, null, null, null, null);


//        getContentResolver().insert(uri, null);
//        getContentResolver().update(uri, null, null, null);
        getContentResolver().delete(uri, null, null);
        getContentResolver().getType(uri);

        Log.d(TAG, "onCreate: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());

    }
}
public class BookContentProvider extends ContentProvider {
    private static final String TAG = "BookContentProvider";

    public BookContentProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.d(TAG, "delete: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        Log.d(TAG, "getType: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return null;

    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO: Implement this to handle requests to insert a new row.
        Log.d(TAG, "insert: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return null;
    }

    @Override
    public boolean onCreate() {
        // TODO: Implement this to initialize your content provider on startup.
        Log.d(TAG, "onCreate: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // TODO: Implement this to handle query requests from clients.
        Log.d(TAG, "query: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO: Implement this to handle query requests from clients.
        Log.d(TAG, "update: " +
                "thread: " + Thread.currentThread().getName() +
                "process: " + Process.myPid());
        return 0;
    }
}

1.当ContentProvider运行与独立进程的时候
在这里插入图片描述

在这里插入图片描述

2.当ContentProvider运行在调用者同一个进程的时候
在这里插入图片描述

在这里插入图片描述

(二)参考:

1.contentProvider详解
https://www.jianshu.com/p/e55ad655b7d5

2.ContentProvider的使用以及基本工作原理
https://juejin.cn/post/6844904158315675655

3.进程的Binder线程池工作过程
http://gityuan.com/2016/10/29/binder-thread-pool/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值