Android;使用"ContentProvider"从网络服务器下载
Android;use "ContentProvider" to download from web server
是否可以使用 ContentProvider
从网络服务器检索(查询)数据?
App中使用的一些数据存储在本地,一些存储在Web服务器中,我想通过ContentProvider
封装检索数据和存储数据。
显然检索本地数据很简单,可以通过 ContentProvider.query()
method.My 问题在于使用该方法从 web.Clearly 查询我可以开始 AsyncTask
到从 Web 获取数据,但结果 return 从 query
方法中编辑,然后终止 doInBackground()
的 AsyncTask 并且下载的数据从未使用过。
那么如何return下载数据到查询方法呢?
我认为您可以将 AsyncTask 从内容提供程序移动到主应用程序并获取结果,例如
new AsyncTask<String, Integer, Cursor>(){
@Override
protected Cursor doInBackground(String... params) {
return getApplicationContext().getContentResolver().query(...);
}
}.execute("");
P.S。
我还在 Google docs 中发现了一些有趣的词:
query()、insert()、delete()、update() 和 getType() 方法——从内容提供商进程中的线程池调用,而不是 UI 线程进程.
但是当我尝试在查询方法中调用网络操作时(没有 AsyncTask),它只是抛出 NetworkOperationInMainThread 异常。
Is it possible to use ContentProvider for retrieving(query) data from
web server?
没有
So how can I return downloaded data to query method?
您显然无法消除下载延迟,但您可以使用例如 loader
并在数据准备好(下载)后将其插入数据库并调用
getContentResolver().notifyChange(your uri, null);
或者您可以使用 LocalBroadcastManager
或 EventBus
等其他方法向您的对象发送消息以再次查询 ContentProvider
。
是否可以使用 ContentProvider
从网络服务器检索(查询)数据?
App中使用的一些数据存储在本地,一些存储在Web服务器中,我想通过ContentProvider
封装检索数据和存储数据。
显然检索本地数据很简单,可以通过 ContentProvider.query()
method.My 问题在于使用该方法从 web.Clearly 查询我可以开始 AsyncTask
到从 Web 获取数据,但结果 return 从 query
方法中编辑,然后终止 doInBackground()
的 AsyncTask 并且下载的数据从未使用过。
那么如何return下载数据到查询方法呢?
我认为您可以将 AsyncTask 从内容提供程序移动到主应用程序并获取结果,例如
new AsyncTask<String, Integer, Cursor>(){
@Override
protected Cursor doInBackground(String... params) {
return getApplicationContext().getContentResolver().query(...);
}
}.execute("");
P.S。 我还在 Google docs 中发现了一些有趣的词: query()、insert()、delete()、update() 和 getType() 方法——从内容提供商进程中的线程池调用,而不是 UI 线程进程.
但是当我尝试在查询方法中调用网络操作时(没有 AsyncTask),它只是抛出 NetworkOperationInMainThread 异常。
Is it possible to use ContentProvider for retrieving(query) data from web server?
没有
So how can I return downloaded data to query method?
您显然无法消除下载延迟,但您可以使用例如 loader
并在数据准备好(下载)后将其插入数据库并调用
getContentResolver().notifyChange(your uri, null);
或者您可以使用 LocalBroadcastManager
或 EventBus
等其他方法向您的对象发送消息以再次查询 ContentProvider
。