Java Android AsyncTask/doInBackground模式

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

这更像是一个“我应该如何设计”而不是一个“我应该如何编码”,所以我希望这是在正确的地方

我有一个从AsyncTask扩展而来的非常标准的类

我如何最好地将其布置成完成许多不同的任务?例如,使用GAE时,我有标准的get、insert、delete和update方法,这些方法都需要异步运行

@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:)