3

我是一个相对较新的 Android 开发人员,现在正在开发一个对 RESTful Web 服务进行大量调用的应用程序。

我在一个文件中进行每次调用,asyncTask但在某些文件中,我拥有的不同异步任务的数量接近 15 个。现在我将它们全部作为我的活动类中的私有类。我怎样才能更好地组织它们(即把它们放在单独的文件中),同时仍然能够更新 UI。我正在考虑将它们传递给context每个构造函数,asyncTask但我只是想知道是否有最佳实践/更好的方法。

谢谢!

4

3 回答 3

1

将 Activity 作为构造函数参数传入对我来说听起来是一个不错的计划。当您将它们声明为内部类时,基本上会发生同样的情况。

但请记住,使用 AsyncTasks 加载数据有一些缺点。一旦启动,它们将继续运行,即使活动已经关闭并持有对您的活动的引用(因此不能被垃圾收集)。

您可能想研究其他概念,例如加载器。

于 2013-08-21T16:11:14.447 回答
1

考虑使用库来简化您的代码库。我编写了droidQuery,除其他外,它可用于简化AsyncTasks。例如,JSON要从中获取数据example.com,并在之后访问上下文,您可以这样做:

$.ajax(new AjaxOptions().url("http://www.example.com")
                        .context(this)
                        .type("GET")
                        .dataType("json")
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                JSONObject json = (JSONObject) params[0];
                                Context context = droidQuery.context();
                                //TODO:
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                            }
                        }));

对于您经常调用的大量不同请求,您还可以创建实例以AjaxOptions供以后使用,这些实例具有不同的 URL、类型、数据类型等:

Map<String, AjaxOptions> requests = new HashMap<String, AjaxOptions>();
//add the example above:
requests.put("example", new AjaxOptions().url("http://www.example.com")
                                         .context(this)
                                         .type("GET")
                                         .dataType("json")
                                         .success(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 JSONObject json = (JSONObject) params[0];
                                                 Context context = droidQuery.context();
                                                 //TODO:
                                             }
                                         })
                                         .error(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 AjaxError error = (AjaxError) params[0];
                                                 Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                                             }
                                         }));

稍后,只需通过调用执行此任务:

$.ajax(requests.get("example"));
于 2013-08-21T16:27:35.973 回答
1

我建议你使用这个库,而不是为不同类型的 asynctask 使用这么多类

你可以看看这里

http://loopj.com/android-async-http/

您的代码将变得非常少,而不是声明可能 asynctask 单独编写大量代码,您只需使用 4 行代码

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
       }
});

我非常有效率地很快得到响应。

我希望这会帮助你。:)

于 2013-08-21T16:11:35.757 回答