Android AsyncTask/doInBackground 模式
Android AsyncTask/doInBackground pattern
这比 "how do I code" 更 "how should I design" 所以我希望这是在正确的地方...
我有一个非常标准的 class 从 AsyncTask 扩展而来。
如何最好地安排它来完成许多不同的任务?例如,使用 GAE,我有标准的获取、插入、删除、更新方法,这些方法都需要 运行 异步。
@Override
protected String doInBackground(String... params) {
if (tipApiService == null) {
TipBeanApi.Builder builder = new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("http://10.0.2.2:8080/_ah/api/").setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
@Override
public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException {
abstractGoogleClientRequest.setDisableGZipContent(true);
}
});
tipApiService = builder.build();
}
try {
tipApiService.insert(tip).execute();
} catch (IOException e) {
Log.d(TAG, "pushToRemote: " + e.toString());
}
return null;
}
你可以看到在try块中我执行了insert方法。
如果我想做其他事情怎么办?我应该为每个操作创建一个全新的 class ,还是传递一个条件语句来指示应该做什么?还有其他 cleaner/better 我不知道的方式吗?
过去几个月我一直在开发一个 Android 应用程序,它使用 GAE 和 Google 云端点,希望我的方法能帮到你。
在我的应用程序中 class 是我构建所有端点的地方,因此对您来说它看起来像这样:
public class ThisApp extends Application {
private static TipBeanApi tipApiService;
@Override
public void onCreate() {
super.onCreate();
buildCloudEndpoints();
}
private void buildCloudEndpoints() {
TipBeanApi.Builder builder = new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("http://10.0.2.2:8080/_ah/api/").setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {@Override
public void initialize(AbstractGoogleClientRequest <? > abstractGoogleClientRequest) throws IOException {
abstractGoogleClientRequest.setDisableGZipContent(true);
}
});
tipApiService = builder.build();
}
public static TipBeanApi getApiService() {
return tipApiService;
}
}
现在,在您的应用程序中,您可以在任何地方执行 ThisApp.getApiService().yourEndpoint().execute();
来执行端点调用。
最后,我建议将所有 AsyncTasks 作为嵌入式 classes,这样您就不会为每个 API 调用都创建一个新的 java 文件.一个好的经验法则是,如果您只在您的应用程序中调用一次 API,那么只需将 AsyncTask 嵌入到调用它的 Activity 中,例如private class YourApiCallTask extends AsyncTask ...
否则如果你多次调用它,那么你应该创建一个名为 "ApiServiceEndpoints" 的 class 并用它来保存你所有的 API 调用任务,例如public static class YourApiCallTask extends AsyncTask ...
如果你说的端点少于 10 个左右,那么你可以将所有 AsyncTasks 放在你的 ApiServiceEndpoints class 中,你的活动代码会更清晰。
希望这对您有所帮助,如果有任何关于在 Android 应用程序中使用 GAE/cloud 端点的问题,请不要犹豫!
这比 "how do I code" 更 "how should I design" 所以我希望这是在正确的地方...
我有一个非常标准的 class 从 AsyncTask 扩展而来。
如何最好地安排它来完成许多不同的任务?例如,使用 GAE,我有标准的获取、插入、删除、更新方法,这些方法都需要 运行 异步。
@Override
protected String doInBackground(String... params) {
if (tipApiService == null) {
TipBeanApi.Builder builder = new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("http://10.0.2.2:8080/_ah/api/").setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {
@Override
public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException {
abstractGoogleClientRequest.setDisableGZipContent(true);
}
});
tipApiService = builder.build();
}
try {
tipApiService.insert(tip).execute();
} catch (IOException e) {
Log.d(TAG, "pushToRemote: " + e.toString());
}
return null;
}
你可以看到在try块中我执行了insert方法。
如果我想做其他事情怎么办?我应该为每个操作创建一个全新的 class ,还是传递一个条件语句来指示应该做什么?还有其他 cleaner/better 我不知道的方式吗?
过去几个月我一直在开发一个 Android 应用程序,它使用 GAE 和 Google 云端点,希望我的方法能帮到你。
在我的应用程序中 class 是我构建所有端点的地方,因此对您来说它看起来像这样:
public class ThisApp extends Application {
private static TipBeanApi tipApiService;
@Override
public void onCreate() {
super.onCreate();
buildCloudEndpoints();
}
private void buildCloudEndpoints() {
TipBeanApi.Builder builder = new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("http://10.0.2.2:8080/_ah/api/").setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() {@Override
public void initialize(AbstractGoogleClientRequest <? > abstractGoogleClientRequest) throws IOException {
abstractGoogleClientRequest.setDisableGZipContent(true);
}
});
tipApiService = builder.build();
}
public static TipBeanApi getApiService() {
return tipApiService;
}
}
现在,在您的应用程序中,您可以在任何地方执行 ThisApp.getApiService().yourEndpoint().execute();
来执行端点调用。
最后,我建议将所有 AsyncTasks 作为嵌入式 classes,这样您就不会为每个 API 调用都创建一个新的 java 文件.一个好的经验法则是,如果您只在您的应用程序中调用一次 API,那么只需将 AsyncTask 嵌入到调用它的 Activity 中,例如private class YourApiCallTask extends AsyncTask ...
否则如果你多次调用它,那么你应该创建一个名为 "ApiServiceEndpoints" 的 class 并用它来保存你所有的 API 调用任务,例如public static class YourApiCallTask extends AsyncTask ...
如果你说的端点少于 10 个左右,那么你可以将所有 AsyncTasks 放在你的 ApiServiceEndpoints class 中,你的活动代码会更清晰。
希望这对您有所帮助,如果有任何关于在 Android 应用程序中使用 GAE/cloud 端点的问题,请不要犹豫!