我一直在研究如何检索如何检索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;
编辑:显然代码没有错,但我有一个全局声明的按钮,导致空指针异常。对不起。
答案 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。