【问题标题】:Return value from AsyncTask class onPostExecute methodAsyncTask 类 onPostExecute 方法的返回值
【发布时间】:2012-12-11 07:50:03
【问题描述】:

好的,现在我有 Class A,其中包含一些微调器,其值将由 Class B 填充,AsnycTask 扩展了从 Web 服务获取微调器值的AsnycTask。在 B 类中,我设法检索值,显示在 Toast 中。现在的问题是如何将这些微调器值传递回 A 类?

我试过了

Can OnPostExcecute method in AsyncTask RETURN values?

通过将Class A 传递给Class B 并将值存储在Class A 的公共变量中,如下所示

@Override
protected void onPostExecute(String result)
{
  classA.classAvariable = result;
}

但是,每当我尝试阅读 classAvariable 时,我总是得到 NullPointer Exception。 似乎从未为变量分配结果。 为了便于阅读,我需要将 Class B 分开,而不是用作内联类。

Java 程序员同行有什么想法吗?

【问题讨论】:

  • 提供你写的代码

标签: android android-asynctask return-value


【解决方案1】:

我猜你是在设置 A 类变量之前尝试读取它。 尝试使用回调来做到这一点..在回调函数中传递值并刷新您的微调器..

您可以创建interface,将其传递给AsyncTask(在构造函数中),然后调用onPostExecute中的方法

例如:

你的界面:

public interface OnTaskCompleted{
    void onTaskCompleted(values);
}

您的活动:

public YourActivity implements OnTaskCompleted{
    //your Activity
    YourTask  task = new YourTask(this); // here is the initalization code for your asyncTask
}

还有你的 AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted(values);
    }
}

【讨论】:

  • 感谢它的工作!但是,您介意解释此代码的基本原理吗?因为它看起来很像在 AsyncTask 类中实现一个 getter 方法(尽管它实际上不起作用)。
  • 这是一种回调函数,它不是将活动传递给任务,而是传递一个侦听器(如按钮侦听器),当他的任务完成时,它会调用回调(调用实现这个回调)然后活动做它想做的事
  • 如果我错了,请纠正我,按照我的逻辑,当 AsyncTask 完成时调用接口实现,而实现 getter 方法可能不起作用,因为 AsyncTask 可能在方法完成时尚未完成叫。这是正确的吗?
  • 非常感谢您的澄清!
【解决方案2】:

这里的问题是,当您执行 AsynchTask 时,它的 doInBackground() 方法在单独的线程中运行,并且启动此 AsynchTask 的线程向前移动,因此 AsynchTask 在您的变量上发生的更改不会反映在父线程上(谁说这个AsynchTask)立即。

例子——

class MyAsynchTask
{

doInbackground()
{
a = 2;
}

}


int a = 5;

new MyAsynchTask().execute();

//这里仍然是5

【讨论】:

  • 好吧,如果您确实阅读了我的代码,我会在 onPostExecute 方法中进行分配……这应该是在 UI 线程上运行的吗?
  • 是的! onPostExecute 在 UI 线程中运行,但在 doInbackground 完成之后。
【解决方案3】:

创建一个像OnCompletRequest()这样的接口,然后将它传递给你的ClassB构造函数,并在onPostExecute(String result)的方法中简单地调用这个接口内的方法,例如complete(yourList list)

【讨论】:

  • 您介意提供一个短代码 sn-p 吗?我不清楚如何在 AsyncTask 类中实现接口。
  • 我刚刚更新了@Nunu 的代码以帮助您了解它的工作原理。
  • 非常感谢!这很有帮助!
【解决方案4】:

你可以通过调用AsyncTask类的get()方法来获取protected Boolean doInBackground()的返回值:

例如你有 AsyncTask 类作为 dbClass 喜欢

dbClass bg = new dbClass(this);
String Order_id = bg.execute(constr,data).get();

在这里,我将 constr 作为 URL 和 data 作为输入字符串传递,以使我的课程动态化。

但要注意 UI 的响应能力,因为get() 会等待计算完成并会阻塞 UI 线程。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 2015-08-19
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多