出于某些原因,我想在onCreate()中初始化我的数据获取,因为我想使用call()而不是query()。
call()方法似乎确实在主线程上运行,onCreate()也是如此。我想知道的是,如果我可以在onCreate()中进行冗长的操作,而不会冒着"应用程序没有响应" -dialog或其他不需要的或不良的行为?
为什么call()不会发生在单独的线程上,就像query()的情况一样?可以调用()导致"应用程序没有响应" -dialog?
注1:如果应用程序启动延迟没有导致"应用程序没有响应" -dialog等,则可以接受应用程序启动延迟。
注2:我正在做一个特殊的ContentProvider,它从Internet上获取东西。
答案 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,网络繁重的代码不应该保留在这种方法中。