1

我整天都在研究,试图找出如何检索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 循环...我省略了很多代码。假设我想检索两个值……一个用户名和一个分数。

编辑:我可能应该提到AsyncTask结尾return null;

编辑:显然代码没有错误,但我有一个全局声明的按钮导致空指针异常。对于那个很抱歉。

4

3 回答 3

0

尽管这不是最佳实践,但您的代码应该可以工作。我认为问题来自另一部分。您能否指定抛出 NullPointerException 的哪一行?

于 2013-05-21T08:11:18.610 回答
0

要从 AsyncTask 中检索值,您可以使用 listener。

首先创建接口监听器(新文件):

public interface AsyncListener {

        void onAsyncFinishMethod(String params);
}

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

public class MainActivity implements AsyncListener {

第三,在您的主类中为侦听器方法创建完整的主体。您正在从接口覆盖方法。因此,如果您更改参数,您也必须在界面中进行更改。在这里您将获得任务完成后的所有结果并调用 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 中使用的参数可能与您不同,onPostExecute 也是如此。

于 2013-05-21T08:22:23.650 回答
0

如果您得到NullPointerException问题中所述的 a 并且这是您的所有onPostExecute()代码,则该字段theMainTextView必须为空。

您必须在启动 AsyncTask 之前对其进行初始化 - 最好的地方是onCreate()为活动或onCreateView()片段。

于 2013-05-21T08:01:13.220 回答