web-dev-qa-db-ja.com

Androidでレトロフィットを使用する

Android 3つのアクティビティがあるアプリ:

  1. ログインアクティビティ
  2. ユーザーに関連するすべてのタスクが表示されるタスクアクティビティ(アレイアダプターを使用して入力)
  3. リスト上のタスクをクリックした結果生じるtask_detailsアクティビティ

REST Apis。これまでに行った研究により、Retrofitを使用するように指示されています。使用方法を確認すると、次のことがわかりました。

  1. メインアクティビティでベースURLを設定します(私がログインアクティビティです)
  2. APIクラスを作成し、注釈を使用して関数を定義する必要があります。
  3. アクティビティでクラスRest Adapterを使用し、コールバックを定義します。

私のアプリが単一のアクティビティアプリであった場合、MainActivity.Javaのすべてをクランチしていましたが、3つのアクティビティで使用するためにステップ1、2、3のすべてのコードをどのように、どこに配置するかわかりません。アプリでRetrofitを使用する方法を教えてください。どうもありがとう。

具体的には、次のネットワーク呼び出しが必要です。1.ユーザーにログインします2.ユーザーのすべてのタスクを取得します。両方の場合、指定されたREST api。

*********************************************
          Calling Api USing Retrofit
*********************************************
**Dependancies** :-
      implementation 'com.Android.support:recyclerview-v7:27.1.1'
        implementation 'com.squareup.picasso:picasso:2.5.2'
        implementation 'com.Android.support:cardview-v7:27.1.1'
    enter code here
**Model**
use the Pozo class

**Api Call**
 -> getLogin()    // use the method



  //API call for Login
    private void getLogin()
    {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams requestParams = new RequestParams();
        requestParams.put("email_id", edit_email.getText().toString());
        requestParams.put("password", edit_password.getText().toString());
        Log.e("", "LOGIN URL==>" + Urls.LOGIN + requestParams);
        Log.d("device_token", "Device_ Token" + FirebaseInstanceId.getInstance().getToken());
        client.post(Urls.LOGIN, requestParams, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                ShowProgress();
            }

            @Override
            public void onFinish() {
                super.onFinish();
                Hideprogress();

            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                Log.e("", "Login RESPONSE-" + response);
                Login login = new Gson().fromJson(String.valueOf(response), Login.class);
                edit_email.setText("");
                edit_password.setText("");
                if (login.getStatus().equals("true")) {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("User Login Successfully!"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_SUCCESS);
                    mdToast.show();
                    Utils.WriteSharePrefrence(SignInActivity.this, Util_Main.Constant.EMAIL, login.getData().getEmailId());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERID, login.getData().getId());

                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERNAME, login.getData().getFirstName());
                    Utils.WriteSharePrefrence(SignInActivity.this, Constant.PROFILE, login.getData().getProfileImage());
                    hideKeyboard(SignInActivity.this);
                    Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                    finish();
                } else {
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                    MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("Login Denied"),
                            MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                    mdToast.show();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                super.onFailure(statusCode, headers, responseString, throwable);
                Log.e("", throwable.getMessage());
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                MDToast mdToast = MDToast.makeText(SignInActivity.this, "Something went wrong",
                        MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                mdToast.show();
            }
        });
    }
41
Stack Man

レトロフィットの使用は非常に簡単で簡単です。

まず、Gradleビルドシステムの例のように、プロジェクトにレトロフィットを追加する必要があります。

compile 'com.squareup.retrofit:retrofit:1.7.1' |

.jarをダウンロードしてlibsフォルダーに配置する別の方法。

次に、RESTエンドポイントへのAPI呼び出しを行うために、Retrofitによって使用されるインターフェースを定義する必要があります。たとえば、ユーザーの場合:

public interface YourUsersApi {

   //You can use rx.Java for sophisticated composition of requests 
   @GET("/users/{user}")
   public Observable<SomeUserModel> fetchUser(@Path("user") String user);

   //or you can just get your model if you use json api
   @GET("/users/{user}")
   public SomeUserModel fetchUser(@Path("user") String user);

   //or if there are some special cases you can process your response manually 
   @GET("/users/{user}")
   public Response fetchUser(@Path("user") String user);

}

OK。これで、APIインターフェースを定義し、使用を試みることができます。

開始するには、RestAdapterのインスタンスを作成し、APIバックエンドのベースURLを設定する必要があります。また、非常に簡単です。

RestAdapter restAdapter = new RestAdapter.Builder()
   .setEndpoint("https://yourserveraddress.com")
    .build();

YourUsersApi yourUsersApi = restAdapter.create(YourUsersApi.class);

ここで、Retrofitはインターフェイスから情報を読み取り、フードの下でRestHandlerを作成します。 HTTPリクエストを実行します。

その後、内部で応答が受信されると、json apiの場合、Gsonライブラリを使用してデータがモデルに変換されるため、Gsonに存在する制限が実際にRetrofitに存在することに注意する必要があります。

モデルへの応答データをシリアライザー/デシリアライズするプロセスを拡張/オーバーライドするには、カスタムシリアライザー/デシリアライザーを後付けする必要があります。

ここでは、Converterインターフェイスを実装し、2つのメソッドを実装する必要がありますfromBody()およびtoBody().

以下に例を示します。

public class SomeCustomRetrofitConverter implements Converter {

    private GsonBuilder gb;

    public SomeCustomRetrofitConverter() {
        gb = new GsonBuilder();

        //register your cursom custom type serialisers/deserialisers if needed
        gb.registerTypeAdapter(SomeCutsomType.class, new SomeCutsomTypeDeserializer());
    }

    public static final String ENCODING = "UTF-8";

    @Override
    public Object fromBody(TypedInput body, Type type) throws ConversionException {
        String charset = "UTF-8";
        if (body.mimeType() != null) {
            charset = MimeUtil.parseCharset(body.mimeType());
        }
        InputStreamReader isr = null;
        try {
           isr = new InputStreamReader(body.in(), charset);
           Gson gson = gb.create();
           return gson.fromJson(isr, type);
        } catch (IOException e) {
            throw new ConversionException(e);
        } catch (JsonParseException e) {
            throw new ConversionException(e);
        } finally {
            if (isr != null) {
                   try {
                      isr.close();
                   } catch (IOException ignored) {
                }
            }
        }
    }

    @Override
    public TypedOutput toBody(Object object) {
        try {
            Gson gson = gb.create();
            return new JsonTypedOutput(gson.toJson(object).getBytes(ENCODING), ENCODING);
        } catch (UnsupportedEncodingException e) {
            throw new AssertionError(e);
        }
     }

    private static class JsonTypedOutput implements TypedOutput {
        private final byte[] jsonBytes;
        private final String mimeType;

        JsonTypedOutput(byte[] jsonBytes, String encode) {
            this.jsonBytes = jsonBytes;
            this.mimeType = "application/json; charset=" + encode;
        }

        @Override
        public String fileName() {
            return null;
        }

       @Override
       public String mimeType() {
           return mimeType;
       }

       @Override
       public long length() {
          return jsonBytes.length;
       }

       @Override
       public void writeTo(OutputStream out) throws IOException {
           out.write(jsonBytes);
       }
    }
 }

そして、RestAdapterのビルドでsetConverter()を使用して必要に応じて、カスタムアダプタを有効にする必要があります

OK。これで、サーバーからAndroidアプリケーションにデータを取得する方法に気付きました。しかし、何らかの方法でデータを管理し、適切な場所でREST呼び出しを行う必要があります。そこで、UIをブロックしないように、バックグラウンドスレッドでデータをクエリするAndroid ServiceまたはAsyncTaskまたはloaderまたはrx.Javaを使用することをお勧めします。

だから今、あなたは呼び出すための最も適切な場所を見つけることができます

SomeUserModel yourUser = yourUsersApi.fetchUser("someUsers")

リモートデータを取得します。

97
Artemis

私は数週間後付けを使用しましたが、最初はアプリケーションで使用するのが難しいと感じました。アプリケーションでレトロフィットを使用する最も簡単な方法を共有したいと思います。その後、後付けで既に十分に把握している場合は、コードを強化し(UIをAPIから分離し、コールバックを使用)、上記の投稿からいくつかのテクニックを取得できます。

アプリには、ログイン、タスクのリストのアクティビティ、および詳細なタスクを表示するアクティビティがあります。

まず、アプリにレトロフィットを追加する必要があります。2つの方法があります。上記の@artemisの投稿に従ってください。

RetrofitはAPIとしてインターフェースを使用します。したがって、インターフェイスクラスを作成します。

public interface MyApi{

/*LOGIN*/
@GET("/api_reciever/login") //your login function in your api
public void login(@Query("username") String username,@Query("password") String password,Callback<String> calback); //this is for your login, and you can used String as response or you can use a POJO, retrofit is very rubust to convert JSON to POJO

/*GET LIST*/
@GET("/api_reciever/getlist") //a function in your api to get all the list
public void getTaskList(@Query("user_uuid") String user_uuid,Callback<ArrayList<Task>> callback); //this is an example of response POJO - make sure your variable name is the same with your json tagging

/*GET LIST*/
@GET("/api_reciever/getlistdetails") //a function in your api to get all the list
public void getTaskDetail(@Query("task_uuid") String task_uuid,Callback<Task> callback);   //this is an example of response POJO - make sure your variable name is the same with your json tagging

}

別のインターフェイスクラスを作成して、APIのすべてのベースアドレスを保持します

public interface Constants{
   public String URL = "www.yoururl.com"
}

ログインアクティビティで、レトロフィットを処理するメソッドを作成します

private void myLogin(String username,String password){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mylogin = restAdapter.create(MyApi.class); //this is how retrofit create your api
mylogin.login(username,password,new Callback<String>() {
        @Override
        public void success(String s, Response response) {
            //process your response if login successfull you can call Intent and launch your main activity

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

MainActivityListで

private void myList(String user_uuid){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskDetail(user_uuid,new Callback<Task>>() {
        @Override
        public void success(ArrayList<Task> list, Response response) {
            //process your response if successful load the list in your listview adapter

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

詳細リストで

private void myDetailed(String task_uuid){

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(Constants.URL)  //call your base url
    .build();


MyApi mytask = restAdapter.create(MyApi.class); //this is how retrofit create your api
mytask.getTaskList(task_uuid,new Callback<Task>() {
        @Override
        public void success(Task task, Response response) {
            //process your response if successful do what you want in your task

        }

        @Override
        public void failure(RetrofitError retrofitError) {
            retrofitError.printStackTrace(); //to see if you have errors
        }
    });
}

レトロフィットを使用する最も簡単な方法ですが、これがあなたのお役に立てば幸いです。

24
chkm8

RetrofitとOttoの併用に関する優れたブログをご覧ください。どちらのライブラリもSquareのものです。

http://www.mdswanson.com/blog/2014/04/07/durable-Android-rest-clients.html

基本的な考え方は、Applicationクラスで「リポジトリ」オブジェクトへの参照を保持することです。このオブジェクトには、残りのAPIイベントリクエストを「サブスクライブ」するメソッドがあります。 1つが受信されると、適切なRetrofit呼び出しを行い、応答を「ポスト」します。応答は、別のコンポーネント(要求を行ったアクティビティなど)によって「サブスクライブ」できます。

これをすべて適切に設定すると、rest APIを介してデータにアクセスするのが非常に簡単になります。たとえば、データのリクエストを作成すると、次のようになります。

    mBus.post(new GetMicropostsRequest(mUserId));

データの消費は次のようになります。

@Subscribe
public void onGetUserProfileResponse(GetUserProfileResponse event) {
    mView.setUserIcon("http://www.gravatar.com/avatar/" + event.getGravatar_id());
    mView.setUserName(event.getName());

}

少し前もって努力する必要がありますが、最終的には、Restを介してバックエンドから必要なものにアクセスするのが「簡単」になります。

4
nPn

RetroFitの使用は非常に簡単です。

  • Build.gradleにdependecyを追加します。

        compile 'com.squareup.retrofit:retrofit:1.9.0'
    
        compile 'com.squareup.okhttp:okhttp:2.4.0' 
    
  • すべてのhttpメソッドのインターフェースを作成します。

  • Jsonの出力をコピーし、pojoクラスを作成してjsonを受け取ります
    応答、 JsonSchema2pojo siteからpojoを作成できます。

  • アダプターを作成し、メソッドを呼び出します

    完全なデモについては、このチュートリアルを試してください Retrofit Android example

3
kundan roy

APIへの参照をアプリケーションクラス内に保存してみてください。次に、アクティビティまたはフラグメントからインスタンスを取得し、そこからAPIを取得できます。それは少し奇妙に聞こえますが、単純なDIの代替手段かもしれません。アプリクラスに参照のみを保存する場合、それは一種の神オブジェクトにはなりません

UPD: http://square.github.io/retrofit/ -ここにいくつかのドキュメントがあり、役に立つかもしれません

3
mr. Nutscracker

まず、すべてをMainActivityに入れるのは悪い習慣であり、 God object になってしまいます。

Retrofit site のドキュメントは素晴らしいので、プロジェクトの構成方法に関する質問を読みます。デモ用に非常に小さなアプリを作成しました。 cat APIからcatをロードし、何が起こっているのかを追うのはかなり簡単です。

サービスからのデータの解析にJSONまたはXMLを使用する例があります。 https://github.com/codepath/Android_guides/wiki/Consuming-APIs-with-Retrofit で見つけることができます

うまくいけば、私がそれを私が持っているように構造化した理由を推測できます。コメントにあるご質問に回答し、回答を更新させていただきます。

2
Ben Pearson

Google Tasks APIへのRetrofit統合を示すこのアプリをチェックしてください。

https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks

MainActivityのActivity AsyncTask内で使用されるRetrofit API(TaskApi)の例と、バックグラウンドサービスのSync Adapter内での使用例があります。

@nPnの回答で投稿された記事の戦略は、おそらくよりエレガントなソリューションですが、少なくとも別の実際の例を見ることができます。

2
Sean

私はこれらのチュートリアルを見つけます AndroidHiveCodePath

私が学んだことを簡単に説明します。

ステップ1:これら3つのdependencies to build.gradleおよび追加Internet permissionからManifest

compile 'com.google.code.gson:gson:2.6.2' // for string to class conversion. Not Compulsory
compile 'com.squareup.retrofit2:retrofit:2.1.0'// compulsory
compile 'com.squareup.retrofit2:converter-gson:2.1.0' //for retrofit conversion

マニフェストに追加します

<uses-permission Android:name="Android.permission.INTERNET" />

ステップ2Creae ApiClientおよびApiInterface。

public class ApiClient {

    public static final String BASE_URL = "http://yourwebsite/services/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

ここで、ApiInterface.class

public interface ApiInterface {

    // getting same data in three different ways.
    @GET("GetCompanyDetailByID")
    Call<CompanyResponse> getDetailOfComapanies(@Query("CompanyID") int companyID);


    @GET("GetCompanyDetailByID")
    Call<ResponseBody> getRawDetailOfCompanies(@Query("CompanyID") int companyID);

    @GET("{pathToAdd}")
    Call<CompanyResponse> getDetailOfComapaniesWithPath(@Path("pathToAdd") String pathToAppend, @Query("CompanyID") int companyID);
}

このサービスを次のように呼び出します

ApiInterface apiService =
                ApiClient.getClient().create(ApiInterface.class);

        Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapanies(2);
        //Call<CompanyResponse> companyResponseCall = apiService.getDetailOfComapaniesWithPath("GetCompanyDetailByID",2);

        companyResponseCall.enqueue(new Callback<CompanyResponse>() {
            @Override
            public void onResponse(Call<CompanyResponse> call, Response<CompanyResponse> response) {
                CompanyResponse comapnyResponse = response.body();
                Boolean status  = comapnyResponse.getStatus();
            }

            @Override
            public void onFailure(Call<CompanyResponse> call, Throwable t) {
            }
        });

生のJson文字列を取得する場合

Call<ResponseBody> call = apiService.getRawDetailOfCompanies(2);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    String jsonStr = response.body().string();
                    if(!jsonStr.isEmpty()){
                        Gson gson = new Gson();

                        JSONObject jObject = new JSONObject(jsonStr).getJSONObject("data");

                        //1st Method
                        Data dataKiType = gson.fromJson(jObject.toString(), Data.class);
                        dataKiType.getCompanyDetail();

                        //2nd method for creaing class or List at runTime
                        Type listType = new TypeToken<Data>(){}.getType();
                        Data yourClassList = new Gson().fromJson(jObject.toString(), listType);
                        yourClassList.getCompanyDetail();
                    }  e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });

http://www.jsonschema2pojo.org/ を使用して、jsonを貼り付けるだけでビジネスオブジェクトを作成できます。ソースタイプをJSONに、アノテーションスタイルをGSonに選択します

2
Xar E Ahmer

https://github.com/square/retrofit/tree/master/samples で、小さいが完全で簡潔な例を見つけました

1
GreyBeardedGeek

初心者は、改修を学ぶのが少し怖いと感じます。学習曲線を簡素化するチュートリアルを用意しました。詳細については、 Retrofit Android tutorial を参照してください。

1

まず、この行をgradleファイルに追加します

compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.squareup:otto:1.3.8'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

次に、アクティビティのOnCreateでオブジェクトを作成します

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);    
OkHttpClient client= new OkHttpClient
                .Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(interceptor).build();
Gson gson=new GsonBuilder()
          .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
          .create();
Retrofit retrofit= new Retrofit.Builder()
                .baseUrl("url")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

インターフェースを作成する

public interface summaryListAPI {
//post
    @FormUrlEncoded
    @POST("index.php")
    Call<summaryList> post(
            @Field("status") String status,
            @Field("sox") String sox
    );
//get
@GET("yesbdeChatHistoryList/{userId}/")
    Call<List<ChatTabTwoResp>> getFriends(
            @Path("userId") int userId
    );
}

クラスを作成する

public class summaryList {
    @SerializedName("bookingSummary") @Expose private List<summaryListData> status = new ArrayList<summaryListData>();
}   

public class summaryListData {
    @SerializedName("date") @Expose private String date;
}

このメソッドをアクティビティに追加します

 public void apiSummaryListMain(final Retrofit retrofit) {
        retrofit.create(summaryListAPI.class).post("8547861657","100").enqueue(new Callback<summaryList>() {
            @Override
            public void onResponse(Call<summaryList> call, Response<summaryList> response) {
                if (response.isSuccessful()) {
                    progressBar.setVisibility(View.INVISIBLE);
                     List<summaryListData> summary_List= response.body().getStatus();                   
                }else{              
                }
            }
            @Override
            public void onFailure(Call<summaryList> call, Throwable t) {

            }
        });

    }
1
jojo
public interface APIService {

    @POST(Constant.updateProfile)
    @FormUrlEncoded
    Call<ResponseBody> updateProfile(
            @Field("user_id") String user_id,
            @Field("first_name") String first_name,
            @Field("last_name") String last_name
    );
}

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

}


public class Body {


// Check Status if Status True or False
String status;
String message;
String checksum;
  
}



public interface OnBodyResponseListner {


public void onSucces(Body response);
public void onFailure(Body response);
public void onBlankBody(Call<ResponseBody> call);

}

 public static void setOnWebServiceCallListner(final Call<ResponseBody> t, final OnBodyResponseListner onBodyResponseListner) {
    t.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                call.cancel();
                Gson gson = new GsonBuilder().serializeNulls().create();
                String json = response.body().string();
                Log.d(TAG, json + "  ~ Response ~  " + json);
                Body body = gson.fromJson(json, Body.class);

                if (body.getStatus().equalsIgnoreCase("true")) {
                    onBodyResponseListner.onSucces(body);
                } else {
                    onBodyResponseListner.onFailure(body);
                }


            } catch (Exception e) {
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            onBodyResponseListner.onBlankBody(call);
            Log.d(TAG, "~ Response Message Blank ~ " + t.getMessage() + " \n Localize Message ~ " + t.getLocalizedMessage() + " \n" + t.getStackTrace().toString());
        }
    });


}


 APIService mService = RetrofitClient.getClient(Constant.BASE_URL).create(APIService.class);


Oprations.setOnWebServiceCallListner(mService.updateProfile("12",
            "first_name",
            "last,name"
    ), new OnBodyResponseListner() {
        @Override
        public void onSucces(Body response) {
            
           

        }

        @Override
        public void onFailure(Body response) {
            
            Toast.makeText(mContext, response.getMessage(), Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onBlankBody(Call<ResponseBody> call) {

        }
    });
}
0
CHirag RAmi

REST APIとインターフェースする独自のタイプセーフなHTTPライブラリを開発するのは非常に苦痛です:接続の確立、キャッシュ、失敗したリクエストの再試行など、多くの側面を処理する必要があります、スレッド化、応答解析、エラー処理など。一方、レトロフィットは、十分に計画され、文書化され、テストされたライブラリであり、貴重な時間と頭痛を大幅に節約します。

'com.google.code.gson:gson:2.6.2'をコンパイルします

コンパイル 'com.squareup.retrofit2:retrofit:2.1.0' //必須

'com.squareup.retrofit2:converter-gson:2.1.0'をコンパイルします//レトロフィット変換用

0
Keshav Gera

RxJavaを使用したシンプルなレトロフィット+ okhttp統合

public WebService apiService(Context context) {
    String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);

    int cacheSize = 5 * 1024 * 1024; // 5 MB
    Cache cache = new Cache(context.getCacheDir(), cacheSize);

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .readTimeout(120, TimeUnit.SECONDS)
            .writeTimeout(120, TimeUnit.SECONDS)
            .connectTimeout(120, TimeUnit.SECONDS)
            .addInterceptor(loggingInterceptor)
            //.addNetworkInterceptor(networkInterceptor)
            .cache(cache)
            .build();

    return new Retrofit.Builder().baseUrl(mBaseUrl)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build().create(WebService.class);

}
0
Aks4125

機能している

enter image description here パッケージcom.keshav.gmailretrofitexampleworking.network;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiClient {
    public static final String BASE_URL = "http://api.androidhive.info/json/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}
==============================================
package com.keshav.gmailretrofitexampleworking.network;

import com.keshav.gmailretrofitexampleworking.models.Message;

import Java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiInterface {
    @GET("inbox.json")
    Call<List<Message>> getInbox();
}

'com.google.code.gson:gson:2.6.2'をコンパイルします

compile 'com.squareup.retrofit2:retrofit:2.0.2'

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

================================================== ===

OnCreate内でRetrofit 2 APiを呼び出す

private void getInbox() {
    swipeRefreshLayout.setRefreshing(true);

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);

    Call<List<Message>> call = apiService.getInbox();
    call.enqueue(new Callback<List<Message>>() {
        @Override
        public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
            // clear the inbox
            messages.clear();

            // add all the messages
            // messages.addAll(response.body());

            // TODO - avoid looping
            // the loop was performed to add colors to each message

            Log.e("keshav","response" +response.body());

            for (Message message : response.body()) {
                // generate a random color

                // TODO keshav Generate Random Color Here
                message.setColor(getRandomMaterialColor("400"));
                messages.add(message);
            }

            mAdapter.notifyDataSetChanged();
            swipeRefreshLayout.setRefreshing(false);
        }

        @Override
        public void onFailure(Call<List<Message>> call, Throwable t) {
            Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show();
            swipeRefreshLayout.setRefreshing(false);
        }
    });
}

ソースコード https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0Jab

https://drive.google.com/open?id=0BzBKpZ4nzNzUc2FBdW00WkRfWW8

0
Keshav Gera

プラグインをインストールし、いくつかの手順に従ってアプリにレトロフィットを実装するだけで、非常に簡単な方法でこの問題を解消しました。

すでに投稿された回答: Androidでのレトロフィット?

追加(QAssist-Android Studioプラグイン)AndroidプラグインをAndroid studio。( https:/ /github.com/sakkeerhussain/QAssist )。

これがお役に立てば幸いです。

0
A-Droid Tech