一. 参考
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/