Android:如何从AsyncTask中检索值?

时间:2013-05-21 07:53:06

标签: android variables android-asynctask

我一直在研究如何检索如何检索doInBackground异步任务中计算的值。没有运气。

我正在做一个基本的HttpURLConnection请求,并使用DOM从网页解析一些XML数据。我成功地将数据存储在两个不同的数组中

///////////inside doInBackground:
for(int x=0; x<10; x++)
{
    username[x] = element.getFirstChild().getNodeValue();
    score[x] = anotherElement.getFirstChild().getNodeValue();
}

现在,我想要做的只是将值输出到textView上。

在许多其他事情中,我曾尝试过:

protected void onPostExecute(String result) 
{
        for (int xx = 0; xx<10; xx++)
        {
            theMainTextView.append(username[xx] + " scored " + score[xx] +"\n");
        }               
}

我没有尝试过任何作品。我收到的重复错误是NullPointerException。我做了一些戏剧性的错误吗?知道我可以尝试的任何其他(甚至模糊)方法吗?如果有帮助,请忽略for循环...我省略了很多代码。假设我想要检索两个值...用户名和分数。

编辑:我应该提到AsyncTaskreturn null;

结尾

编辑:显然代码没有错,但我有一个全局声明的按钮,导致空指针异常。对不起。

3 个答案:

答案 0 :(得分:0)

如果您收到问题中所述的NullPointerException,则这是onPostExecute()代码,而字段theMainTextView必须为空。

您必须在启动AsyncTask之前对其进行初始化 - 最好的位置是活动的onCreate()或碎片的onCreateView()

答案 1 :(得分:0)

虽然这不是最佳做法,但您的代码应该可行。我认为问题来自另一部分。你能否指出哪一行抛出NullPointerException?

答案 2 :(得分:0)

要从AsyncTask检索值,您可以使用侦听器。

首先创建接口列表器(新文件):

public interface AsyncListener {

        void onAsyncFinishMethod(String params);
}

其次,对您调用异步任务的主类使用implement(示例)

public class MainActivity implements AsyncListener {

第三,在主类中为侦听器方法创建完整的主体。你是从界面覆盖方法。因此,如果您更改params,您将不得不在界面中进行更改。任务完成后,您将获得所有结果并调用onPostExecute。

@Override
public void onAsyncFinishMethod(String params) {
    Log.d("xxx", params);
}

第四,为异步任务设置监听器。这意味着:在异步任务类中创建此方法

public void setOnAsyncFinishedMethod(AsyncListener listener) {
    this.listener = listener;
}

确保您的异步任务具有类型为侦听器的私有参数

private AsyncListener listener;

在异步任务类的onPostExecute中调用侦听器方法作为最后一个(如果你没有这个方法,请创建它)

@Override
protected void onPostExecute(String params) {
    listener.onAsyncFinishMethod(param);
}

最后一步,在主类中调用异步任务时,不要忘记绑定setOnAsyncFinishedMethod方法

我的例子:

private void runMyAsyncTask() {
    CustomAsync async = new CustomAsync();
    async.setOnAsyncFinishedMethod(this);//<<< before execute use setOnAsyncFinishedMethod
    thread.execute();
}

当然,onAsyncFinishedMethod中使用的params可能与你不同,也就是onPostExecute。