2

私は Android の初心者であることに言及し始めました。簡単な入門書を読み終えたばかりで、最初のアプリを実装する必要があります。このアプリは、注文を受けるために使用される予定です。ローカル データベースに保存するすべてのデータの中で、2 つのテーブルが最も重要です: Customers と Articles。後者はすべてのテーブルの中で最大です (約 20000 レコード)。アプリの主要なプロセスの 1 つであるフェッチユーザーがデバイスで日常の操作を開始するボタンを押したときに、アプリがオフラインで動作するために必要なすべてのデータ。

さて、プロセスは次のステップで構成されています。

a. a.安静なサービスを読み取り、顧客データを取得します
。Json オブジェクトへの応答を解析する
c. それらの顧客を Customers テーブルに挿入します
。記事データを取得するための安らかなサービスの読み取り
e.Json オブジェクトへの応答を解析します
f. それらの記事を記事テーブルに挿入します

これは私がやろうとしていたことです:

  1. すべての HTTP GET 要求を処理するヘルパー クラスを記述します。次に、Customers と Article のすべてのデータをダウンロードする必要があるたびに、このクラスを呼び出します。
  2. このプロセスはすべて時間がかかる可能性があるため、バックグラウンドで実行する必要があります。したがって、いくつかの提案に基づいて、このすべてのコードを Bound Service 内に配置します。
  3. この長い処理はすべてバックグラウンドで行われていますが、何らかのインジケーター (ProgressDialog) を表示する必要があります。これが、バウンド サービスの使用を選択した理由です。

これらのことのほとんどを別々に行う方法についての一般的な考えはわかったと思いますが、すべてをまとめることはまったく別の話だと思います。

これらは、パズルを組み立てる必要がある今私が持っている質問です。

  1. 説明されているプロセスの 6 つのステップすべてを実行する順序は正しい/効率的だと思いますか? 何か変更を加える必要があるとしたら、何を変更しますか?
  2. サービスを開始したアクティビティが明示的にキャンセルされるか、別のアクティビティによって隠されている場合、サービスには、プロセスが終了したことをユーザーに知らせる方法が必要です。どうすればそれを実装できますか?
  3. サービス内で SQLite DB に書き込むことは可能/推奨されますか? アクティビティ内で行う場合と同じですか?
  4. J2ME でも同様のことを行いました。上記の 6 つのステップのようなものを配置すると、それらはすべて順番に、つまり 1 つずつ実行されます。Androidでも同じですか?

あまり多くの質問をしないことを願っています。関連性が高いのでまとめてみました。

基本的に、この質問では、動作するコードを求めているわけではありません (ただし、サンプル コードを提供できれば問題ありません)。私が本当に求めているのは、いくつかの提案とガイダンスです。「ポイント 3 については、これが役立つと思います」 、 「この記事が役立つかもしれません」「あれよりもこれを使った方がいいと思います」など。そういうこと。

あなたは専門家であり、私を正しい方向に導くために誰かが本当に必要なので、私はあなたに来ることにしました.

どうもありがとうございました。

PSこの質問を閉じないでください。何かを変更する必要があると思われる場合は、お知らせください。変更します。

4

3 に答える 3

3

あなたは専門家なので、私はあなたに来ることにしました

まずi am not experti am not knowledgeable私よりも専門家を見つけることができますが、これは私の意見 hope to give you some helpです.

まず第一に、AsyncTaskあなたのような短いバックグラウンドジョブに使用する必要があるため、ダウンロードに使用することを忘れてください。ダウンロードしたいファイルの量はかなり大きいと思います.(私はそう思います)

Google をチェックdownloadmanagerして、それがどのように機能するかを確認してください。

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

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

ユーザーがアプリを閉じたときにAndroidまたはユーザーによってサービスが破壊されたくないために使用したい場合serviceはどうしますか?unbound serviceどうにかしてデータを取得したいと思います。

効率的にするために、次の手順をお勧めします。

a. 安らかなサービスを読み取り、顧客データを取得します

b. 顧客データを取得したら、次のことを行います。

  • 別のサービスまたはスレッドを作成して、安らかなサービスを読み取り、記事データを取得します

  • 古いサービスまたはスレッドで Json オブジェクトへの応答を解析する

これで、同時に実行される 2 つのサービスまたはスレッドができたinsert parseので、各サービスまたはスレッドで明らかな手順に従います。

なぜ a と d を結合しないのですか? ユーザーはダウンロード進行状況バーの後ろで長時間待つのが好きではないと思うからです。

データをデータベースに挿入するには、次を使用するtransactionことをお勧めします。

http://greendao-orm.com/

データベースの場合は他のものよりも効率的ORMであり、db の実装から解放されます。

サービスを開始したアクティビティが明示的にキャンセルされるか、別のアクティビティによって隠されている場合、サービスには、プロセスが終了したことをユーザーに知らせる方法が必要です。どうすればそれを実装できますか?

使用通知:

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

この長い処理はすべてバックグラウンドで行われますが、何らかのインジケーター (ProgressDialog) を表示する必要があります。これが、バウンド サービスの使用を選択した理由です。

バインドされていないサービスから UI を更新するにはどうすればよいですか?`

を使用するLocalBroadCastManagerか、一般的にBroadCastReciever

サービスからの Android 更新アクティビティ UI

J2ME でも同様のことを行いました。上記の 6 つのステップのようなものを配置すると、それらはすべて順番に、つまり 1 つずつ実行されます。Androidでも同じですか?

これはあなたのステップに依存します。あなたが実行する私のアイデアに従う場合、concurrentlyあなたのアイデアを実行する場合は実行しますsequentially

幸運を。

于 2014-09-02T05:46:09.913 に答える
2

説明されているプロセスの 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をトランザクションで組み合わせる必要があります。

それ以外の場合、順序は重要ではありません。データが関連していない場合は、これらのプロセスを分離して順番に実行することをお勧めします。


サービスを開始したアクティビティが明示的にキャンセルされるか、別のアクティビティによって隠されている場合、サービスには、プロセスが終了したことをユーザーに知らせる方法が必要です。どうすればそれを実装できますか?

IntentServiceクラスの実装から始めることをお勧めします。これはバックグラウンド スレッドを処理し、単一のイベントがIntent処理するデータを配信するイベントのキューのように機能します。

実際、 IO カンファレンスの 1 つで Google が提示したパターンの 1 つを実装できます。ビデオに示されているオプション A を実装しました。それは私にとって本当にうまくいきます。秘訣はContentProvider、バックグラウンドから使用すると、CursAdapter のおかげで変更をリッスンする UI が自動的に更新されることです。

UI の進行状況を更新するには、 OttoLocalBroadcastManagerなどのイベント バス ライブラリを使用できます。

テーブルを拡張してステータスと進行状況を保存することもできます。テーブルを更新すると、UI も自動的に更新されます。ただし、これらの更新はまれである必要があることに注意してください。たとえば、サービス バックグラウンドでテーブルの進行状況が更新される頻度を制御し、最初に進行状況を計算してチェックします。変更されている場合はサービス ローカル変数。

アプリがバックグラウンドにある場合は、ステータス通知を投稿してください。ユーザーは、通知をクリックしてアプリに戻ることができるはずです。


サービス内で SQLite DB に書き込むことは可能/推奨されますか? アクティビティ内で行う場合と同じですか?

サービス内で行うことができます。実際、上記のパターンに従う場合は、バックグラウンド サービス スレッドのプロセッサ層で実行します。


J2ME でも同様のことを行いました。上記の 6 つのステップのようなものを配置すると、それらはすべて順番に、つまり次々に実行されます。Androidでも同じですか?

サーバーとの通信がどのように機能するかは、完全にあなた次第です。クラスを使用することにした場合IntentService、Android では悪い考えではないシーケンスで動作します。一方、 Service クラスを直接拡張し、スレッド プールを使用して独自のスレッド エグゼキューターを実装することもできます。IntentService無関係な操作専用のクラスを作成することもできます。


レッスンを読むこともお勧めします。

HTTP 接続の実装を直接操作したくない場合は、RetrofitまたはVolleyの使用を検討してください。

JSON パーサーだけが必要な場合は、次の 2 つが最適です。

于 2014-09-02T09:26:09.983 に答える
2

私はあなたのようなことをしました。

最初のステップでは、次のよう webserviceに POST メソッドの HTTP GETからデータを取得します。AsyncTask

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);
}
}

そして私のコールバッククラスは次のとおりです:
public abstract class ServiceCallback{

public abstract void onTaskComplete(String result);
}

Web サービスからデータを取得する必要があるすべての場所で、コード内で AsyncTask を呼び出します。

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

Gson2番目のステップでは、またはのようなjsonヘルパーライブラリを使用して、onTaskCompleteメソッドでWebServiceの応答を解析しますJackson。たとえば、ジャクソンで:

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

最後に、データをデータベースに保存します。DBに接続するためGreenDaoに、ORMとして使用することを好みます。このようにして、DB にデータを保存することは、次のような 1 行のコードで実行できます。

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

GreenDaoORMを使用するには、このリンクが非常に役立ちます。

于 2014-09-01T05:08:51.593 に答える