2013-08-21 59 views
3

我是一位相对较新的Android开发人员,现在正在致力于一个应用程序,该应用程序会对RESTful Web服务进行大量调用。组织AsyncTask的最佳方式

我在拨打asyncTask,但在某些文件中,我有不同的异步任务的数量有15个。现在我把它们全部作为我的活动类中的私有类。我怎样才能更好地组织它们(即把它们放在单独的文件中),同时仍然能够更新用户界面..我想通过context到每个asyncTask的构造函数,但我只是想知道是否有最佳做法/更好办法。

谢谢!

+2

你应该为您的网络请求使用像Volley这样的库,而不是多个asynctasks。 – tbruyelle

+0

我同意上面的伴侣,或者如果你想坚持Asy​​ncTasks使用ThreadPool执行程序! – Pavlos

+0

AsyncTasks可以在[线程池执行程序](http://developer.android.com/reference/android/os/AsyncTask.html#THREAD_POOL_EXECUTOR)中执行。既然它是公开的,你可以(ab)将它用于其他事情。 – zapl

回答

1

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

,你可以看看这里

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

你的代码会变得非常非常少的,而不是声明,可能的AsyncTask seperately写批量的代码,你可以只用4行代码

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

我非常高效地快速响应响应。

我希望这会帮助你。 :)

+0

iI正在寻找什么。谢谢! –

+0

欢呼:) - 只要看到性能2秒即可加载数据。 –

1

作为构造函数参数传递给Activity听起来像是一个很好的计划。基本上,当你将它们声明为内部类时也是如此。

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

你可能想看看其他概念,如装载机。

1

考虑使用库来简化您的代码库。我写了droidQuery,其中,可以用来简化AsyncTask s。例如,从example.com获得JSON数据,并有机会获得上下文之后,你可以这样做:

$.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")); 
+0

'。上下文(this)'应该可能是应用程序上下文。存储对活动上下文的引用是很糟糕的,除非它仅在活动生存期中使用。异步的事情往往会保持引用的方式。 – zapl

+2

@zapl,这个上下文对象也不是必须的,但更多的是方便。没有它,'droidQuery'参数将为空。 – Phil

相关问题