推荐的方法/命令从web服务读取数据,parsing数据并将其插入到SQLite数据库中

我有一个开始提到我是完全陌生的Android,我刚刚阅读了一本快速,介绍性的书,现在我必须实现我的第一个应用程序。 这个应用程序将被用来接受订单。 在我要存储在本地数据库中的所有数据中,有两个表是最重要的:客户和文章,后者是所有表中最大的(aprox 20000logging)我的应用程序中的主要进程之一,当用户按下启动设备上的日常操作的button时,我的应用程序需要脱机工作的所有数据。

那么这个过程包含以下几个步骤:

一个。 阅读一个宁静的服务来检索客户数据
湾 parsing对Json对象的响应
C。 将这些客户插入客户表
d。 阅读一个宁静的服务来检索文章数据
即 parsing对Json对象的响应
F。 将这些文章插入文章表

这就是我计划要做的事情:

  1. 编写一个处理所有HTTP GET请求的助手类。 然后在我需要下载所有客户和文章数据时调用这个类
  2. 由于所有这些过程可能需要很长时间,所以我需要做这个背景。 所以基于一些build议,我将把所有这些代码放在绑定服务中。
  3. 虽然所有这些长时间的处理都是在后台进行的,但我必须展示某种指标(ProgressDialog)。这就是我select使用绑定服务的原因

虽然我觉得我已经有了分开做大部分事情的总体思路,但我认为把所有的东西放在一起是完全不同的事情。

所以这些就是我现在要解决的问题:

  1. 你认为我所执行的所有6个步骤的执行顺序是正确的还是有效的? 如果你不得不做一些改变,你会改变什么?
  2. 如果启动服务的活动被明确取消或被其他活动隐藏,则服务必须让用户知道该过程已完成。 我怎么能实现呢?
  3. 是否可以/build议在服务中写入SQLite数据库? 是否和我在一个活动中一样?
  4. 在J2ME中,我做了类似的事情,当我把上面提到的6个步骤放在一起时,所有这些步骤都是按顺序执行的,也就是一个接一个地执行。 在Android中是一样的吗?

我希望我不要问太多的问题。 我把它们放在一起,因为它们都是相关的。

基本上在这个问题中,我不是要求工作代码(虽然它可以,如果你可以提供一些示例代码)我真的是一些build议,一些指导。 像“嗨,我认为这可能会帮助你点3”“你可能会发现这篇文章有用”“我想你最好用这个,而不是那个” 。 那种事。

我决定找你,因为你是专家,我真的需要有人把我放在正确的方向。

非常感谢你。

PS请不要closures这个问题,如果你认为我需要改变一些东西只是让我知道,我会做到这一点。

我决定找你,因为你是专家

首先, i am not expert ,也是i am not knowledgeable你可以find比我更多的专家,但这是我的意见 hope to give you some help

首先忘记使用AsyncTask下载,因为它必须用于不像你的短背景作业我认为你想下载的文件量是相当大的(我想是这样)

检查谷歌downloadmanager ,看看它是如何工作的,它可能会帮助你。

http://developer.android.com/reference/android/app/DownloadManager.html

http://blog.vogella.com/2011/06/14/android-downloadmanager-example/

如果你想使用service使用unbound service因为你不希望该服务被Android或用户closures时的应用程序销毁吗? 我想你想以任何方式得到你的数据。

为了高效,我推荐以下步骤:

一个。 阅读一个宁静的服务来检索客户数据

湾 当你得到客户数据时:

  • 创build另一个服务或线程来读取一个宁静的服务来检索文章数据

  • parsing对旧服务或线程的Json对象的响应

现在你有2个服务或线程同时运行,所以按照显然insert parse ,所以,在每个服务或线程上的步骤。

为什么我不把a和d结合起来? 因为我认为用户不喜欢在下载进度条后面等待很多时间。

为了插入你的数据到数据库使用transaction ,我build议你使用:

http://greendao-orm.com/

它是比其他数据库更有效的ORM ,你可以从数据库中免费获得。

如果启动服务的活动被明确取消或被其他活动隐藏,则服务必须让用户知道该过程已完成。 我怎么能实现呢?

使用通知:

http://developer.android.com/training/notify-user/build-notification.html

http://www.tutorialspoint.com/android/android_notifications.htm

http://www.vogella.com/tutorials/AndroidNotifications/article.html

尽pipe所有这些长时间的处理都是在后台进行的,但我必须展示某种指标(ProgressDialog)。这就是我select使用绑定服务的原因。

我如何从一个未绑定服务更新UI?

使用LocalBroadCastManager ,或者一般的BroadCastReciever

来自服务的Android更新活动UI

在J2ME中,我做了类似的事情,当我把上面提到的6个步骤放在一起时,所有这些步骤都是按顺序执行的,也就是一个接一个地执行。 在Android中是一样的吗?

这取决于你的步骤,如果你遵循我的想法,你concurrently运行,如果你运行你的想法,你将sequentially运行。

祝你好运。

我做了像你的东西。

在第一步中,我使用AsyncTask获取来自webservice的POST方法的HTTP GET数据,如下所示:

 public class GetService extends AsyncTask<String, String, String> { private String mRestUrl; private ServiceCallback mCallback; private final HttpClient Client = new DefaultHttpClient(); private String Content; private String url; private String Error; private ProgressDialog barProgressDialog; private ProgressDialog Dialog; public GetService(String restUrl, ServiceCallback callback) { this.mRestUrl = restUrl; this.mCallback = callback; this.url = restUrl; Dialog = new ProgressDialog(AppContext.CurrentContext); } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(String... urls) { Content = null; BufferedReader reader = null; try { StringBuilder builder = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(this.url); HttpResponse response = client.execute(get); int status = response.getStatusLine().getStatusCode(); if (status == 200) // sucess { HttpEntity e = response.getEntity(); // String data = EntityUtils.toString(e); InputStream content = e.getContent(); reader = new BufferedReader(new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { builder.append(line); } Content = builder.toString(); } else if (status == 401) { return "-Auth Failed Error Code 400"; } else { return "-Error Code: " + status; } } catch (Exception ex) { Error = ex.getMessage(); } finally { Dialog.dismiss(); try { reader.close(); } catch (Exception ex) { ex.printStackTrace(); } } return Content; } @Override protected void onPostExecute(String result) { try { GetService.this.get(20000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } mCallback.onTaskComplete(result); super.onPostExecute(result); } } 

和我的callback类是:
公共抽象类ServiceCallback {

 public abstract void onTaskComplete(String result); } 

我在我的代码中调用了AsyncTask,我想从webservice获取数据:

  new GetService(url, new ServiceCallback() { public void onTaskComplete(String response) { // Parse Response of WebService } }).execute(); 

在第二步中,我使用json helper库(如GsonJacksonparsing了onService方法中WebService的响应。 例如jackson:

 List<YourClass> data = new ObjectMapper() .readValue( response, new TypeReference<List<YourClass>>() { }); 

最后,我将数据存储在数据库中。 连接到数据库I GreenDao使用GreenDao作为我的ORM。 通过这种方式,DB中的storin数据可以像这样在一行代码中完成:

 //after converting json to object YourORMDaoClass.insertOrReplaceInTx(data); 

使用GreenDao ORM 这个链接是非常有帮助的;

你认为我所执行的所有6个步骤的执行顺序是正确的还是有效的? 如果你不得不做一些改变,你会改变什么?

这取决于。 如果这个数据是相关的,不能彼此没有,那么你应该改变这样的顺序:

 a. Read a restful service to retrieve the Customers Data b. Parse the response to Json Objects d. Read a restful service to retrieve the Articles Data e. Parse the response to Json Objects c. Insert those customers to the Customers Table f. Insert those articles to the Articles Table 

步骤cf应该在交易中结合。

否则,顺序无关紧要。 如果数据不相关,那么分离这些进程并按顺序运行它们可能是一个好主意。


如果启动服务的活动被明确取消或被其他活动隐藏,则服务必须让用户知道该过程已完成。 我怎么能实现呢?

我build议从IntentService类的实现开始。 它为您处理后台线程,并像单个Intent提供要处理的数据的事件队列一样工作。

其实你可以在他们的一个IO会议上实现Google提供的模式之一。 我已经实现了video上显示的选项A. 它对我很好。 诀窍是使用来自后台的ContentProvider自动更新用户界面,该用户界面可以通过CursorAdapter监听更改。

要更新UI进度,您可以使用LocalBroadcastManager或事件总线库(例如Otto) 。

你也可以扩展你的表并存储状态和进度,更新表也会自动更新UI,只要记住这些更新应该是罕见的,例如在服务后台控制更新表进度的频率首先计算进度并检查服务本地variables,如果它被改变。

如果你的应用程序在后台,发布状态通知 。 用户应该能够导航到您的应用程序点击通知。


是否可以/build议在服务中写入SQLite数据库? 是否和我在一个活动中一样?

你可以在服务中做到这一点。 其实,如果你遵循上面提到的模式,你可以在后台服务线程的处理器层执行。


在J2ME中,我做了类似的事情,当我把上面提到的6个步骤放在一起时,所有这些步骤都是按顺序执行的,也就是一个接一个地执行。 在Android中是一样的吗?

这完全取决于你如何与服务器通信的工作。 如果您决定使用IntentService类,那么它将在Android上不是一个坏主意。 另一方面,您可以直接扩展Service类并使用线程池来实现自己的线程执行程序。 您也可以为不相关的操作提供专用的IntentService类。


我也build议阅读课程:

  • 在不消耗电池的情况下传输数据
  • 使用同步适配器传输数据

如果您不想直接使用HTTP连接实现,请考虑使用Retrofit或Volley

如果你只需要JSONparsing器,那么这两个是最好的:

  • GSON
  • jackson