【问题标题】:Best way to call web services? [closed]调用网络服务的最佳方式? [关闭]
【发布时间】:2019-07-31 06:33:38
【问题描述】:

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

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

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

这听起来像是一个愚蠢的问题,但任何想法都会有所帮助,我们将不胜感激。

【问题讨论】:

  • 你应该使用改造库来调用你的服务它是最好的库 square.github.io/retrofit 并使用单例模式创建一个名称类似于 NetworkHandler 的类,所有你的网络员工放置类。
  • 优点是你不需要一次又一次地编写相同的代码,只需编写一次并使用单例使用整个应用程序。
  • @AnasMehar 非常感谢阿纳斯!非常感激。我会搜索一下

标签: android api web-services httprequest


【解决方案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);
}

最后,您可以从任何 Activity 调用接口,例如 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
          }
      });
 }
 }

【讨论】:

  • 谢谢奥古斯都,你能和我分享那部分吗?我真的很感激。
  • 哇!!!这正是我想要的!!非常感谢!
  • 很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多