2017-03-07 25 views
1

我一直在使用Retrofit,使呼叫我的服务器的方法:回用改造方法

public class MainActivity extends AppCompatActivity { 

    // ... activity methods here, removed for simplicity ... 

    // Used to subscribe to a user given their userId 
    public void subscribeToUser(int userId) { 
     final ApiInterface apiService = ApiClient.createService(ApiInterface.class); 

     Call<BasicResponse> call = apiService.subscribe(userId); 
     call.enqueue(new Callback<BasicResponse>() { 
      @Override 
      public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { 
       if (response.isSuccessful()) { 
        Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show(); 
       } 
      } 

      @Override 
      public void onFailure(Call<BasicResponse> call, Throwable t) { 
       Log.e(TAG, t.toString()); 
      } 
     }); 
    } 

} 

我现在需要在其他活动使用同样的方法(subscribeToUser()),但它没有任何意义将该方法复制并粘贴到其他活动中。然后我会有相同的代码两次。

所以我可以把方法放在一个地方让它让活动知道调用是否成功或失败?我应该如何组织这个?

这里是我ApiClient.java类:

public class ApiClient { 

    public static final String API_BASE_URL = "http://www.website.com/api/"; 

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(API_BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    public static <S> S createService(Class<S> serviceClass) { 
     Retrofit retrofit = builder.client(httpClient.build()).build(); 

     return retrofit.create(serviceClass); 
    } 

    public static <S> S createService(Class<S> serviceClass, final String authToken) { 
     if (authToken != null) { 
      httpClient.addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Interceptor.Chain chain) throws IOException { 
        Request original = chain.request(); 

        // Request customization: add request headers 
        Request.Builder requestBuilder = original.newBuilder() 
          .header("Authorization", "Bearer " + authToken) 
          .method(original.method(), original.body()); 

        Request request = requestBuilder.build(); 
        return chain.proceed(request); 
       } 
      }); 
     } 

     OkHttpClient client = httpClient.build(); 
     Retrofit retrofit = builder.client(client).build(); 

     return retrofit.create(serviceClass); 
    } 
} 

这里是我的ApiInterface.java类:

public interface ApiInterface { 
    @FormUrlEncoded 
    @POST("subscribe") 
    Call<BasicResponse> subscribe(@Field("userId") Integer userId); 
} 

感谢。

+0

您是否尝试使用'BaseActivity extends AppCompatActivity'包含方法'subscribeToUser',之后'MainActivity'和其他活动扩展了BaseActivity。 –

+0

@RoShanShan如果我需要在活动之外使用'subscribeToUser()'方法,就像在一个适配器中一样? – user7669706

+0

我认为你可以在Activity中使用该方法并将结果发送到适配器。或者你可以发送'context'到你的适配器并使用((YouActivity)上下文).subscribeToUser()。 –

回答

2

在我看来,createService(ApiInterface.class)不应该被调用多次。这不是必要的,并会减慢你的应用程序。您可以尝试创建一个单例模式UserService如下:

public class UserService { 

private UserService userService; 
final ApiInterface apiService; 
//Contructor private to prevent init object from outside directly. 
private UserService() { 
    apiService = ApiClient.createService(ApiInterface.class); 
} 
//use this method when you need to use UserService 
public static UserService getInstance() { 
    if(userService == null) { 
     userService = new UserService(); 
    } 
} 

// Used to subscribe to a user given their userId 
public void subscribeToUser(int userId, ServiceCallBack serviceCallBack) { 
    final ApiInterface apiService = ApiClient.createService(ApiInterface.class); 

    Call<BasicResponse> call = apiService.subscribe(userId); 
    call.enqueue(new Callback<BasicResponse>() { 
     @Override 
     public void onResponse(Call<BasicResponse> call, Response<BasicResponse> response) { 
      if (response.isSuccessful()) { 
       Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_LONG).show(); 
       serviceCallBack.successful(response); 
      } else { 
       Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Call<BasicResponse> call, Throwable t) { 
      Log.e(TAG, t.toString()); 
      serviceCallBack.fail(t); 
     } 
    }); 
} 
//this is callback interface, help you know whether success from outside. 
interface ServiceCallBack { 
    void successful(Response response); 
    void fail(Throwable t); 
} 
} 

如何使用:

UserService.getInstance(1, new ServiceCallBack(){ 

     @Override 
     public void successful(Response response) { 
      //process successful 
     } 

     @Override 
     public void fail(Throwable t) { 
      //process fail 
     } 
    }); 

现在你可以把所有的方法涉及到用户的API UserService类重用。