调用Web服务的最佳方法?

时间:2019-07-31 06:33:38

标签: android api web-services httprequest

我正在开发通过asyncTask调用网络服务的android应用程序。

问题几乎是在我创建asynctask并在其中调用Web服务的每个活动中。在某些活动中,代码几乎是相同的,并且它调用相同的Web服务,唯一的区别在于Onpost方法导致该操作我想参加的活动因活动而异。

我想做的是拥有一个单独的类或活动,其中包含对Web服务的所有调用,但是我不知道该怎么做。如何根据调用此Web服务的活动来更改onPost的内容?

听起来像是一个愚蠢的问题,但是任何想法都会有所帮助,并且会受到赞赏。

1 个答案:

答案 0 :(得分:1)

是的。我通常使用retrofit拨打电话,然后:

  • 创建一个包含所有调用的类,例如CallerClass,

  • 创建一个接口来监听CallerClass的结果,例如CallerClassListener

  • 从应用程序类初始化CallerClass 这样,我可以从任何活动或类中获取CallerClass实例。 我知道我的解释不是最好的方法,但请参见here以获取完整的实现

更新 提供以上解释的代码,您可以访问here

您可以使用应用程序类,例如AppNameApp:

public class AppNameApp extends Application {
private ApiService apiService;

@Override
public void onCreate() {
    super.onCreate();
}

public ApiService getApiService() {
    if (apiService == null) {
        apiService = 
provideRetrofit(ApiService.URL).create(ApiService.class);
    }
    return apiService;
}

private Retrofit provideRetrofit(String url) {
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(provideOkHttpClient())
            .addConverterFactory(GsonConverterFactory.create(new Gson()))
            .build();
}

private OkHttpClient provideOkHttpClient() {
    OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
    okhttpClientBuilder.connectTimeout(30, TimeUnit.SECONDS);
    okhttpClientBuilder.readTimeout(30, TimeUnit.SECONDS);
    okhttpClientBuilder.writeTimeout(30, TimeUnit.SECONDS);
    return okhttpClientBuilder.build();
}
}

然后做一个界面,说ApiService:

public interface ApiService {
String URL = "https://api.example.com" + "/v1/";

@GET("accounts/{accountId}")
    Call<AccountInfo> getAccountInfo(@Path("accountId") String accountId);
}

最后,您可以从任何活动(如HomeActivity)调用该界面:

public class HomeActivity extends AppCompatActivity{

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}

private void getAccountInfo() {
 ((App) getApplication()).getApiService().getAccountInfo()
      .enqueue(new Callback<AccountInfo>() {
          @Override
          public void onResponse(Call<AccountInfo> call, 
   Response<AccountInfo> response) {
              if (response.isSuccessful()) {
                  // return to UI thread
                  // display AccountInfo on UI
              }
          }

          @Override
          public void onFailure(Call<AccountInfo> call, Throwable t) {
              // skip for now
          }
      });
 }
 }