【问题标题】:How to return anonymous List or ArrayList on AsyncTask in Android如何在 Android 中的 AsyncTask 上返回匿名 List 或 ArrayList
【发布时间】:2012-01-26 15:33:06
【问题描述】:

在完成 AsyncTask 后,我有 6 种不同类型的 List 结果。并且List 结果应该返回到Activity。例如:List<A>List<B>List<C>List<D>List<E>,最后是List<F>

这是我的AsyncTask

public class myAsync extends AsyncTask<String, String, List> {

    private List resultList;

    @Override
    protected List doInBackground(String... params) {
        //params[0] is url
        //params[1] is type
        callAPI api = new callAPI(params[0], params[1]);
        // According to type api decides type of List and generates
        return api.getJSON(); // returns a List which already parse JSON
    }

    @Override
    protected void onPostExecute(List result) {
        // Result is here now, may be 6 different List type.
        this.resultList = result 
    }

    // returns result
    public List getResultList() { return this.resultList; }
}

我会这样调用 AsyncTask:

myAsync task = new myAsync();
task.execute(params);
List myList = task.getResultList(); // type is uncertain
Log.d("Tag", Integer.toString(myList.size());

你知道,我必须指出标签之间的返回类型(Result)。如果我为List 选择特定类型,则它不适用于其他类型。

确实,我已经尝试返回 List&lt;Object&gt; 并且只返回 List 类型。但是没有用。

我不想使用 6 个不同的Async。是否可以仅使用AsyncTask 解决此问题?我想我需要匿名列表或类似的东西不确定。谁能解释一下?

【问题讨论】:

  • 你可以忽略,它不会出错,它只是警告你。
  • 你的意思是我应该使用这个定义:AsyncTask&lt;String, String, List&gt;。如果是,返回类型是什么?我已经将所有类型作为普通列表返回,出现 NullException 错误。
  • onpostexecute 应该在您的其他线程中设置您的列表,而不是使用 getter 方法。你怎么知道列表是否完成?您必须使用 getter 方法进行轮询。你可以做一个异步,只保留一个结果列表。
  • 在这里发布堆栈跟踪,我怀疑你得到的 NullPointer 可能来自其他地方。
  • Marvin 的回答解释了 NullPointer,但不确定如何检查状态。

标签: java android android-asynctask


【解决方案1】:

首先,我应该指出,您获取列表的顺序是正确的。让我演示一下:

// Initialize myAsync
myAsync task = new myAsync();

// This will do work for some period of time, this statement DOES NOT 'block'
// till myAsync completes, it will run it in the background
task.execute(params);

// This will return null because by the time you get here, task.execute most
// likely hasn't finished yet.
task.getResultList();

编辑:现在您已经包含了您想要对列表结果执行的操作,以下是修改onPostExecute 方法的方法:

@Override
protected void onPostExecute(List result) {
  Log.d(TAG, "The returned list contains " +result.size()+ "elements");
  // Do anything else you need to with the returned list here
}

总而言之,如果您需要对返回的列表执行任何其他操作(除了打印其大小),例如比较、打印项目等,您需要在 onPostExecute 方法中执行此操作。

【讨论】:

  • 抱歉语法错误。当然它必须是task.getResultList()。现已更正。你是对的,getResultList() 方法还为时过早。我怎么打电话?
  • @OgulcanOrhan 正如我在您的previous 问题中指出的那样,您通常希望使用 AsyncTask 的onPostExecute 方法来做您需要做的任何事情 与列表。编辑您的问题,在task.getResultList() 中包含您做什么,我可以给您一个更好的答案。
  • 更新了doInBackgroundonPostExecute。我希望现在很清楚。
  • @OgulcanOrhan 请同时添加与task.getResultList();相关的所有代码。 IE。您如何处理返回的列表? (这就是我所要求的)。例如,您是否将其打印出来,是否更新列表视图,...?
  • @OgulcanOrhan 在不知道您的意图如何工作的任何细节(公平警告)的情况下,我会说是的,您需要从 onPostExecute 中启动您的意图。无论如何,请尝试所有这些,如果您遇到问题,请创建一个包含所有新详细信息的新问题,我们会尽力帮助您。希望这会有所帮助。
【解决方案2】:

根据列表的内容(什么是 A、B、C 等),您也许可以为它们制作一个界面。

因此,如果 A、B、C 等是对象,您可以创建一个我们称为 ListContentInterface 的接口。然后,您的每个元素都必须实现 ListContentInterface。然后您可以将类型指出为:

List<ListContentInterface>.

之后,您可以通过获取列表的第一个元素并检查它的类来测试列表的内容到底是什么:

if(element.getClass() == ClassToTestFor.class) ...

如果对象有任何共同的方法,你应该在接口中指定它们。如果它们有所有共同的方法,您可以直接使用 List 列表,而无需测试对象的类(因为它们都可以执行接口定义的操作)。

我希望这对您有所帮助。它可能不是接口的最佳用途或最佳解决方案,但它可能会解决您的问题。

【讨论】:

  • 是的,我可以为这 6 个不同的对象创建一个接口,我会的。但是会发生什么变化?我不明白接下来的步骤。
  • 当您拥有接口中的所有项目时,您可以创建一个包含实现该接口的对象的列表。这样您就可以对所有对象使用相同类型的列表。之后,如果您需要针对不同的项目类型做一些特定的事情,您只需将元素从列表中取出,并测试它们是哪个类,然后再对它们执行特定于项目的逻辑。
【解决方案3】:

我正在使用 execute().get(); 解决这类问题

例子

call from activity

    ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get();

    In async task 

    public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>>
    {
    public jsonparsing(Activity activity)
        {
            this.activity = activity;
            arraylistitem = new ArrayList<String>();        
        }

        protected ArrayList<String> doInBackground(Void... arg0) 
        {
               // Do anything else you need to with the returned list here
             return arraylistitem;
            }
    }

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多