在Class中执行AsyncTask

时间:2014-12-21 03:20:37

标签: java android android-asynctask

我在一个名为

的类中有一个方法
ChopraWisdom.GetQuote()

从互联网中提取一些数据。要使用它,我必须在我的活动中使用AsyncTask。这很好,但我的活动代码现在变得混乱了AsyncTask代码。

我希望我可以在我的类中隐藏AsyncTask,然后创建另一个名为

的方法
ChopraWisdom.GetQuoteAsync()

但我不确定如何传递"行动" (我来自.Net背景)以处理需要进行的各种UI更新。

在C#中,我将方法签名定义为:

ChopraWisdom.GetQuoteAsync(Action preExecute, Action postExecute, Action updateProgress)

问题:

  1. java是否有类似于' Action'?
  2. 的内容
  3. '包装'可接受的模式是什么? Java中的异步功能如此?
  4. 我喜欢干净的代码,但我在这里挑剔吗?
  5. 请提供示例。

    编辑 - 添加了示例类

    public class ChopraWisdom
    {
         public string GetQuote()
         {
            //...do stuff and return a string
         }
    }
    

2 个答案:

答案 0 :(得分:1)

  1. 你应该考虑使用Loaders而不是AsynkTask(使用android支持lib)。
  2. 如果您仍想在您的情况下使用AsyncTask,最好的方法是创建新的界面Action(类似https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/functions/Action0.java
  3. 您可以在项目中使用RxJava并使用他们拥有的https://github.com/ReactiveX/RxJava/tree/1.x/src/main/java/rx/functions
  4. 您可以将https://github.com/evant/gradle-retrolambda与(2)选项结合使用,在Java代码中提供类似lambda的C#。

答案 1 :(得分:1)

  1. Java确实具有与Action相当的东西。它被称为Function,仅在Java 8中可用。将函数作为参数传递的标准方法是创建接口并将其作为参数提供。这样,您可以传入实现该接口的类的实例,也可以创建内联的匿名类。您在Android(OnClickListener等)

  2. 中到处遇到后者
  3. 我强烈建议您查看Android Annotations。它提供了有用的功能,如:

    • 依赖注入
    • 查看注射
    • OnClickListener via annotation
    • 通过注释的AsyncTask
    • ...
  4. 最好的事情:一切都是在编译时通过子类化完成的,因此没有性能影响,你可以检查框架在任何给定点上做了什么。

    1. 你根本不挑剔。清洁代码在Android开发中非常重要,因为无论如何你必须编写很多样板/粘合代码。
    2. 这里有一些其他方便的Android框架,绝对值得一试: