我可以在ContentProvider的onCreate()上进行冗长的操作吗?

时间:2015-08-06 07:19:12

标签: android multithreading android-contentprovider

出于某些原因,我想在onCreate()中初始化我的数据获取,因为我想使用call()而不是query()。

call()方法似乎确实在主线程上运行,onCreate()也是如此。我想知道的是,如果我可以在onCreate()中进行冗长的操作,而不会冒着"应用程序没有响应" -dialog或其他不需要的或不良的行为?

为什么call()不会发生在单独的线程上,就像query()的情况一样?可以调用()导致"应用程序没有响应" -dialog?

注1:如果应用程序启动延迟没有导致"应用程序没有响应" -dialog等,则可以接受应用程序启动延迟。
注2:我正在做一个特殊的ContentProvider,它从Internet上获取东西。

4 个答案:

答案 0 :(得分:1)

不,你不应该做长时间的操作。 “......它不能执行冗长的操作,否则应用程序启动会被延迟。”

消息来源:http://developer.android.com/reference/android/content/ContentProvider.html#onCreate()

至于最后一个问题; query(...)方法不在单独的线程上运行,也不在call(...)方法上运行。如果你想在单独的线程上运行,你应该手动创建线程(例如通过AsyncTask)或使用Loaders。

答案 1 :(得分:0)

不,您不应该在Content Provider的onCreate()中进行冗长的操作。

来自官方文件。

  

在应用程序启动时,应用程序主线程上的所有已注册内容提供程序都会调用此方法。它不能执行冗长的操作,否则应用程序启动将被延迟。

答案 2 :(得分:0)

在onCreate()方法中执行Longy操作根本不是一个好主意。因为它将在主UI线程上运行,您将获得ANR消息。更好的想法是使用AsyncTaskLoaders来获取数据。如果要从本地SQLite数据库中获取数据,请使用cursorLoaders。使用AsynctaskLoader将使获取操作在单独的线程上运行。您的用户界面将顺利运行。如果存在底层数据更改,您可以使用内容观察器查看更改,它将自动影响UI数据。

答案 3 :(得分:0)

OnCreate()方法在UI线程上运行,所以android禁止在UI线程上运行,这里适用。例如:I / O,网络繁重的代码不应该保留在这种方法中。