我正在开发通过asyncTask调用网络服务的android应用程序。
问题几乎是在我创建asynctask并在其中调用Web服务的每个活动中。在某些活动中,代码几乎是相同的,并且它调用相同的Web服务,唯一的区别在于Onpost方法导致该操作我想参加的活动因活动而异。
我想做的是拥有一个单独的类或活动,其中包含对Web服务的所有调用,但是我不知道该怎么做。如何根据调用此Web服务的活动来更改onPost的内容?
听起来像是一个愚蠢的问题,但是任何想法都会有所帮助,并且会受到赞赏。
答案 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
}
});
}
}