48

Parse.comをバックエンドとして使用するロケーションベースのメッセージングアプリを構築しています(Parse.comはUrban Airship / PubNubなどに似ています)。次に、より適切な制御のために独自のバックエンドに切り替えたいと考えています。このために、RESTAPIを介して公開された機能を備えたnode.jsベースのバックエンドを構築しました

このAPIを使用するには、すべてのHTTPリクエスト/レスポンスまたはREST API呼び出しを抽象化し、getUsers()、sendMessage()などのさまざまな操作に直接関数を提供するAndroidライブラリ( Parse.comのAndroid SDKに類似)を構築します。

AndroidでRESTAPIクライアントを実装する方法:

さて、Androidライブラリを構築したいと考えており、ユーザーがアプリを操作しているときにREST API呼び出しが同時に発生する可能性があることを考えると、どちらのアプローチを進めるのが最適でしょうか?私は他の提案/推奨事項も受け入れています。

更新:最初に、正常に機能するIntentService+ResultReceiverを使用して独自のライブラリを構築しました。しかし、後でAndroidAsyncHttpに出くわしました。これを使って。それは素晴らしいです!

4

6 に答える 6

43

Google IO Pro Tips 2010に基づいて私が見た中で最も良い意味は、RESTベースであり、メモリをリークしないようにアクティビティライフサイクルで非常に巧妙に機能するRoboSpiceライブラリです。

クイックインフォグラフィックライブラリはこちら

  • ローダーはRESTではなくデータベース用に設計されており、アクティビティのリセット時にリセットされます。つまり、データが失われます。
  • 非同期タスク、いいえ。
  • インテントサービス+結果レシーバーは基本的にRoboSpiceの動作方法であるため、独自のライブラリを構築する場合は、このアプローチを採用します。
  • IntentServiceメソッドと同様に、サービスも優れていますが、この場合、IntentServiceの動作は少し良くなります。

このService方法の方が良いかもしれません。彼らが使用しているrobospiceサービスを見てください。これは、動作しなくなったときにExecutorService終了します。これは、Android固有のJavaの同時実行性よりも多くなります。リクエストの処理中にサービスが実行され、リクエストが残っていない場合は、サービスが終了することに注意してください。ServiceRequests

または任意のタイプのスレッドプールを使用する利点はExecutorService、一度に実行できる要求の数を定義できることです。あなたが非常に速い接続を持っていない限り、2-4は私が今まで提案した中で最も多いです。

于 2012-11-18T20:15:12.027 に答える
9

私はRetrofitを使用しましたが、エンドポイントを管理し、データ/コレクション/オブジェクトを解析するための簡単な構造を提供する非常に優れたライブラリです。

ドキュメントは、コードを簡単に記述できるほど完全です。

CQFD>それのために行く

于 2014-12-08T21:37:39.570 に答える
8

このクラスが役立つかもしれません:-

/*Copyright 2014 Bhavit Singh Sengar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/

package com.infotech.zeus.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import android.widget.Toast;

public class RestClient {


        JSONObject data = new JSONObject();
        String url;
        String headerName;
        String headerValue;

        public RestClient(String s){

            url = s;
        }


        public void addHeader(String name, String value){

            headerName = name;
            headerValue = value;

        }

        public void addParam(String key, String value){

            try {
                data.put(key, value);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        public String executePost(){  // If you want to use post method to hit server

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader(headerName, headerValue);
            HttpResponse response = null;
            String result = null;
            try {
                StringEntity entity = new StringEntity(data.toString(), HTTP.UTF_8);
                httpPost.setEntity(entity);
                response = httpClient.execute(httpPost);
                HttpEntity entity1 = response.getEntity();
                result = EntityUtils.toString(entity1);
                return result;
                //Toast.makeText(MainPage.this, result, Toast.LENGTH_LONG).show();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;



        }

        public String executeGet(){ //If you want to use get method to hit server

            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(url);
            String result = null;
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            try {
                result = httpClient.execute(httpget, responseHandler);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return result;
        }
}

このクラスを使用する簡単な例:

RestClient client = new RestClient("http://www.example.com/demo.php");  //Write your url here
        client.addParam("Name", "Bhavit"); //Here I am adding key-value parameters
        client.addParam("Age", "23");

        client.addHeader("content-type", "application/json"); // Here I am specifying that the key-value pairs are sent in the JSON format

        try {
            String response = client.executePost(); // In case your server sends any response back, it will be saved in this response string.

        } catch (Exception e) {
            e.printStackTrace();
        }
于 2014-04-09T10:14:13.107 に答える
4

RESTDroidを使用することもできます。これはRoboSpiceと非常に似ていますが、使用が簡単です(ただし、それほど強力ではありません)。

RESTDroid用のParse.comモジュールを作成する場合は、GitHubに追加することを躊躇しないでください。

于 2013-02-13T20:05:09.553 に答える
1

もう1つ追加すると、最近、エンジン(iOSのMKNetworkKitで使用される)とAndroid用のRESTAPIと通信するコマンドを実装するための優れたライブラリの作成を開始しました。RESTAPIにアクセスしようとしている人には役立つかもしれません。https://github.com/m2d2/MDBaseAndroidLibraries

于 2013-02-04T03:06:16.023 に答える
1

これらのタスクを自動的に実行するために、 rest-springプラグインを使用してAndroidアノテーションを試すこともできます。

彼らはAndroid用のSpringFrameworkのラッパーを使用し、 RESTAPIを処理するための本当に良い方法を提供します。

例:

AsyncTask-> doInBackground()を@Backgroundアノテーションに置き換えます。

@Background
protected void backgroundWork(){
    // do something in background
}

runOnUiThread、onPostExecute()を@UiThreadに置き換えます

@UiThread
protected void uiWork(){
    // do something on UI Thread
}

RestAPIの場合

残りのクライアントを作成します。

@Rest(rootUrl = "http://company.com/ajax/services",
      converters = { MappingJackson2HttpMessageConverter.class })
public interface MyRestClient {

    @Get("/events")
    EventList getEvents();
}

残りのクライアントを使用する:

@RestClient
MyRestClient myRestClient;

public void showAllEvents(){
    EventList list = myRestClient.getEvents();
    // do something with this list

}
于 2016-05-06T08:56:13.883 に答える