Java Android AsyncTask/doInBackground模式
这更像是一个“我应该如何设计”而不是一个“我应该如何编码”,所以我希望这是在正确的地方 我有一个从AsyncTask扩展而来的非常标准的类 我如何最好地将其布置成完成许多不同的任务?例如,使用GAE时,我有标准的get、insert、delete和update方法,这些方法都需要异步运行Java Android AsyncTask/doInBackground模式,java,android,google-app-engine,design-patterns,android-asynctask,Java,Android,Google App Engine,Design Patterns,Android Asynctask,这更像是一个“我应该如何设计”而不是一个“我应该如何编码”,所以我希望这是在正确的地方 我有一个从AsyncTask扩展而来的非常标准的类 我如何最好地将其布置成完成许多不同的任务?例如,使用GAE时,我有标准的get、insert、delete和update方法,这些方法都需要异步运行 @Override protected String doInBackground(String... params) { if (tipApiService == null) { Ti
@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;
}
@覆盖
受保护的字符串doInBackground(字符串…参数){
if(服务==null){
TipBeanApi.Builder=new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
新的AndroidJsonFactory(),null)
.setRootUrl(“http://10.0.2.2:8080/_ah/api/setGoogleClientRequestInitializer(新的GoogleClientRequestInitializer(){
@凌驾
public void initialize(AbstractGoogleClientRequest AbstractGoogleClientRequest)引发IOException{
abstractGoogleClientRequest.setDisablegzip内容(true);
}
});
tipApiService=builder.build();
}
试一试{
tipApiService.insert(tip.execute();
}捕获(IOE异常){
Log.d(标记“pushToRemote:+e.toString());
}
返回null;
}
您可以在try块中看到我执行insert方法
如果我想做点别的呢?我应该为每个操作创建一个完整的新类,还是传递一个指示应该做什么的条件语句?有没有其他我不知道的更干净/更好的方法 过去几个月,我一直在开发一款使用GAE和谷歌云端点的Android应用程序,希望我的方法能帮到你 在我的应用程序类中,是我构建所有端点的地方,因此对您来说,它将如下所示:
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;
}
}
公共类此应用程序扩展应用程序{
专用静态TipBeanApi TIP服务;
@凌驾
public void onCreate(){
super.onCreate();
buildCloudEndpoints();
}
私有void buildCloudEndpoints(){
TipBeanApi.Builder=new TipBeanApi.Builder(AndroidHttp.newCompatibleTransport(),
新的AndroidJsonFactory(),null)
.setRootUrl(“http://10.0.2.2:8080/_ah/api/)。setGoogleClientRequestInitializer(新的GoogleClientRequestInitializer(){@Override
公共无效初始化(AbstractGoogleClientRequest感谢移动端点的想法,这非常有意义。不过,我很清楚,您仍然在为每个操作创建一个新的AsyncTask类?显然,该类现在可以更小,并且是一个内部类,但仍然看起来不必要/感觉脏。我感觉我将以常量中的switch语句结束构造函数(ugh)…也许工厂式模式是更好的方法?是的,我正在为每个端点调用创建一个新的AsyncTask,原因有两个。首先,我的不同API调用有不同的响应,因此处理响应(或错误处理)可以封装在它自己的doInBackground()中方法。其次,每个任务都有一个可以重写的onPostExecute()方法,该方法在UI线程上运行,允许您使用响应中的任何新数据更新UI。如果您有常见的响应处理,请随意压缩到一个任务中。使用工厂获取任务实例也是一个好主意!如果这有帮助,请接受/upvote:)