Android 3つのアクティビティがあるアプリ:
REST Apis。これまでに行った研究により、Retrofitを使用するように指示されています。使用方法を確認すると、次のことがわかりました。
私のアプリが単一のアクティビティアプリであった場合、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();
}
});
}
レトロフィットの使用は非常に簡単で簡単です。
まず、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")
リモートデータを取得します。
私は数週間後付けを使用しましたが、最初はアプリケーションで使用するのが難しいと感じました。アプリケーションでレトロフィットを使用する最も簡単な方法を共有したいと思います。その後、後付けで既に十分に把握している場合は、コードを強化し(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
}
});
}
レトロフィットを使用する最も簡単な方法ですが、これがあなたのお役に立てば幸いです。
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を介してバックエンドから必要なものにアクセスするのが「簡単」になります。
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
APIへの参照をアプリケーションクラス内に保存してみてください。次に、アクティビティまたはフラグメントからインスタンスを取得し、そこからAPIを取得できます。それは少し奇妙に聞こえますが、単純なDIの代替手段かもしれません。アプリクラスに参照のみを保存する場合、それは一種の神オブジェクトにはなりません
UPD: http://square.github.io/retrofit/ -ここにいくつかのドキュメントがあり、役に立つかもしれません
まず、すべてをMainActivityに入れるのは悪い習慣であり、 God object になってしまいます。
Retrofit site のドキュメントは素晴らしいので、プロジェクトの構成方法に関する質問を読みます。デモ用に非常に小さなアプリを作成しました。 cat APIからcatをロードし、何が起こっているのかを追うのはかなり簡単です。
サービスからのデータの解析にJSONまたはXMLを使用する例があります。 https://github.com/codepath/Android_guides/wiki/Consuming-APIs-with-Retrofit で見つけることができます
うまくいけば、私がそれを私が持っているように構造化した理由を推測できます。コメントにあるご質問に回答し、回答を更新させていただきます。
Google Tasks APIへのRetrofit統合を示すこのアプリをチェックしてください。
https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks
MainActivityのActivity AsyncTask内で使用されるRetrofit API(TaskApi)の例と、バックグラウンドサービスのSync Adapter内での使用例があります。
@nPnの回答で投稿された記事の戦略は、おそらくよりエレガントなソリューションですが、少なくとも別の実際の例を見ることができます。
私はこれらのチュートリアルを見つけます AndroidHive 、 CodePath
私が学んだことを簡単に説明します。
ステップ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に選択します
https://github.com/square/retrofit/tree/master/samples で、小さいが完全で簡潔な例を見つけました
初心者は、改修を学ぶのが少し怖いと感じます。学習曲線を簡素化するチュートリアルを用意しました。詳細については、 Retrofit Android tutorial を参照してください。
まず、この行を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) {
}
});
}
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) {
}
});
}
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'をコンパイルします//レトロフィット変換用
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);
}
機能している
パッケージ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'
================================================== ===
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
プラグインをインストールし、いくつかの手順に従ってアプリにレトロフィットを実装するだけで、非常に簡単な方法でこの問題を解消しました。
すでに投稿された回答: Androidでのレトロフィット?
追加(QAssist-Android Studioプラグイン)AndroidプラグインをAndroid studio。( https:/ /github.com/sakkeerhussain/QAssist )。
これがお役に立てば幸いです。