Async Task需要来自doInBackground的非数组返回对象,但查找对象数组

时间:2014-07-24 17:54:12

标签: java android arrays android-asynctask android-studio

我有如下对象设置,并将信息传递给异步任务:

DynamoDBManager.CoreInfo passCoreInfo = new DynamoDBManager.CoreInfo();
passCoreInfo.setId(1);
passCoreInfo.setAttr("C3P0");
passCoreInfo.setMethodCallType("Get Info");

new DynamoDBManagerTask()
        .execute(passCoreInfo);

然而,尽管作为一个对象传入它然后以某种方式转换为CoreInfo [],但返回期望CoreInfo根据我的错误。我已经尝试将doInBackground和AsyncTask的返回类型更改为ArrayList,因此它期望一个数组,但它仍然期望CoreInfo而不是return coreInfo行的CoreInfo []。

private class DynamoDBManagerTask extends
            AsyncTask<DynamoDBManager.CoreInfo, Void, DynamoDBManager.CoreInfo> {
        List<DynamoDBManager.Info1> info1Result = new ArrayList<DynamoDBManager.Info1>();
        List<DynamoDBManager.Info2> info2Result = new ArrayList<DynamoDBManager.Info2>();

        protected DynamoDBManager.CoreInfo doInBackground(
                DynamoDBManager.CoreInfo... coreInfo) {

            //If coreInfo[0].getMethodCallType.equals("Get Info"),  info1Result = call DynamoDB query 1
            //Else  info2Result = call DynamoDB query 2

            return coreInfo; // Should remain untouched, same info as when passed in
        }

        @Override
        protected void onPostExecute(DynamoDBManager.CoreInfo coreInfo) {

            //If coreInfo[0].getMethodCallType.equals("Get Info"), save info1Result to SQLite table 1
            //Else save info2Result to SQLite table2            
        }
    }

如何修复代码以使类型对齐?并且它不会抛出Required:CoreInfo Found:CoreInfo []错误?

3 个答案:

答案 0 :(得分:2)

参数DynamoDBManager.CoreInfo...是一个varargs参数,这意味着您可以将多个CoreInfo对象作为单独的参数传递,并将它们转换为数组。您必须返回该数组的元素,例如coreInfo[0]

答案 1 :(得分:1)

您可以执行return coreInfo[0]

但是,如果你永远不改变coreInfo通过它的理由是什么?将其保留在AsyncTask之外或AsyncTask

中的字段之外

答案 2 :(得分:0)

请注意...方法签名中的三个点(doInBackground)。那你的参数将被转换为数组。

作为示例,请使用以下代码并注意代码下方控制台输出中的差异:

package box.sand;

public class Main {

    public static void main(String[] args) {
        printStrings("foo", "bar");
        printStrings("baz");
        printStringsLooped("foo", "bar");
        printStringsLooped("baz");
    }

    public static void printStrings(String... strings) {
        System.out.println(strings);
    }

    public static void printStringsLooped(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }
}

控制台输出:

[Ljava.lang.String;@5c3a5635
[Ljava.lang.String;@79f1e0e0
foo
bar
foo

如果您确定只有一个对象将被传递到&#39; doInBackground&#39;,您只需返回数组的第一个对象(即return coreInfo[0])。