如何有效利用的AsyncTask [英] How to use Asynctask effectively

查看:144
本文介绍了如何有效利用的AsyncTask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来的Andr​​oid。我要问你AsyncTask的家伙。我有一个活动显示项目的(一个应用程序,歌曲,故事..)详细信息。它需要很多相关数据如截图,相关的应用程序(歌曲,故事),...那么什么是最好的实现AsyncTask的呢?我创建一个AsyncTask的每个任务?(例如:2的AsyncTask:1取得截图,1获得相关项目...),或在doInBackGround把所有和发布进度

I'm new to Android. I want to ask you guys about Asynctask. I have an activity displays item's(an app, song, story..) detail info. It requires many related data such as screenshots, related apps (songs, stories), ... So what is the best implement of Asynctask ? Do i create one asynctask for each task (ex: 2 asynctask : 1 for get screenshots, 1 for get related item...) or put all in doInBackGround and publish progress?

先谢谢了。

推荐答案

从面向对象的角度来看,业务逻辑的东西应该总是从UI的东西分离出来。我想孤立和集中我所有的电话业务像getSong(),getStore()等成一个POJO,并保持我的活动类只专注于用户界面操控/渲染,这是我要做的事:

From a OO perspective, business logic stuff should be always isolated from UI stuff. I would isolating and centralizing all my business call like getSong(), getStore() etc. into a POJO, and keep my activity class only focus on UI manipulation/rendering, this is how I do it:


  1. 定义一个接口IBusinessDAO

  2. 定义RealBusinessDAO实现IBusinessDAO

  3. 定义MockBusinessDAO实现IBusinessDAO

  4. 呼叫IBusinessDAO.getSong();里面AsyncTask.doInBackground()

  1. Define an interface IBusinessDAO
  2. Define RealBusinessDAO implements IBusinessDAO
  3. Define MockBusinessDAO implements IBusinessDAO
  4. Call IBusinessDAO.getSong(); inside AsyncTask.doInBackground()

public class MyActivity extends Activity {
  IBusinessDAO businessDAO;

  ... ...

  private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    ... ...        

    protected void doInBackground(Void... params) {
      businessDAO.getSong();
    }
  }

  ... ...

  public void onCreate(Bundle savedInstanceState) {
    if (runInTest)
      businessDAO = new MockBusinessDAO();
    else
      businessDAO = new RealBusinessDAO();

    new myAsyncTask().execute();
  }

}


因此​​,在每个不同的活动中您的AsyncTask实现,你AsyncTask.doInBackgroud()将是简洁明快,从而使您的code更高效,更易于维护。

So in each of your AsyncTask implementation among different Activities, your AsyncTask.doInBackgroud() will be simple and clean, resulting keeping your code more efficient and maintainable.

这也有助于提高code可测试性,对于单元测试你的业务逻辑,因为它是一个POJO,你可以用纯粹的JUnit编写测试用例。有时候,我们要测试的UI组件,我们真的不关心企业如何底层逻辑的实现,比如,我的业务逻辑连接到远程HTTP服务器下载一些JSON数据,我不想每次都是这样,当我做到这要测试的UI布局,针对这种情况,我可以很容易地改变我的所有活动都使用MockBusinessDAO(排序Spring的DI的概念),而没有任何关于如何实际的业务逻辑的实现,测试的UI组件。

It also help improve code testability, for unit-test your business logic, as it is a POJO, you can use purely JUnit write your test case. Sometimes we want to test UI component and we don't really care how underlying business logic is implemented, for instance, my business logic connect to remote http server download some json data, I don't want to do this every time when I just want to test the UI layout, for this situation, I can easily change all my Activities use MockBusinessDAO (sort of Spring's DI concept), to test UI component without concerning How the actual business logic is implemented.

最后,还可以提高你的code可重用性的businesDAO是没有什么关系的Andr​​iod不是一个经典的POJO等,此外,你不需要担心任何并发您BusinessDAO实现中,所有它的方法将是所谓内AsyncTask.doInBackground()方法。

Last, it also improve your code reusability as your businesDAO is nothing related to Andriod other than a classic POJO, in addition, you don't need concern any concurrency within your BusinessDAO implementation, as all it's methods will be called inside AsyncTask.doInBackground() method.

希望帮助。

这篇关于如何有效利用的AsyncTask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆