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 端点的问题,请不要犹豫!