【问题标题】:What is the most correct way to pass several parameters of different types to doInBackground (Params... params) method?将几个不同类型的参数传递给 doInBackground (Params...params) 方法的最正确方法是什么?
【发布时间】:2012-12-20 16:46:44
【问题描述】:

我正在为一个网站设计 Android 客户端。因此,我必须实施许多不同的网络操作。例如用户授权或在服务器上搜索。为此,我必须使用一些参数和 URL 向 REST Web 服务器发送 JSON 请求。所以我不仅必须传递字符串参数,还必须传递一些数据结构(例如 LinkedHashMap)。这个问题我不知道最正确的方法。到目前为止,我做了下一步:

  1. protected Boolean doInBackground(Object... param)。然后将 param[0],param [1] 转换为不同的类型。我认为这是一种不好的方式。
  2. 为此目的使用 javatuples 库:

protected Void doInBackground(Pair<String, LinkedHashMap<String, Object>>... params)

这似乎太复杂和多余的代码。最重要的我必须添加

@SuppressWarnings("unchecked")

或者我收到了类型安全警告。

所以可能有一些专家可以帮助我并建议最正确和最有效的方法。

【问题讨论】:

  • 为不同的类型创建不同的AsyncTask 实现,或者通过类层次结构来实现,您只需对所有类型都相同的通用基类/接口进行操作。警告见stackoverflow.com/questions/3096708/java-generics-and-varargs
  • 为什么不构建自己的类,比如 MyServerRequest,然后传递一个实例?

标签: java android android-asynctask


【解决方案1】:

您可以拥有自己的 Asynctask 构造函数并将它们存储为可以在 doinBackground 中使用的字段

    private class Task extends AsyncTask<Void, Void, Void> {

    Task(int a, long b){
       //store a, b
    }
    @Override
    protected Void doInBackground(Void... arg) {    
    }   
  }

然后

new Task(1,2).execute();

【讨论】:

    【解决方案2】:

    “如果我是你”,我不会使用 AsyncTask 作为我的 REST Application,而是您可以想出其他设计模式来接管 AsyncTask 工作。 原因之一是丢失bandwidth 怎么可能发生??如果您在Http Transaction 中间可能发布或获取数据,我来打个电话,您的活动将在后台运行,操作系统可能会终止您可爱的活动并关闭AsyncTask。

    您可以使用Service 组件而不是AsyncTask,因为android 对它的评价高于后台活动。

    看看 virgil 来自 Google IO 的 this 旧视频

    【讨论】:

      【解决方案3】:

      我通常会创建一个简单的类来封装我将使用的所有数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-20
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多