0

我有一个返回字符串的函数,里面有一个 AsynTask。我的问题是我的函数必须在 AsynTask 完成工作后返回值!

这是我的代码:

public String getWeather(Context cont,int cityid,String latitude, String longitude){
    this.latitude=latitude;
    this.longitude=longitude;

    new get_scores() {
        protected void onPreExecute() {
            super.onPreExecute();

        }

        protected void onPostExecute(Boolean result) {

        }
    }.execute();

    return weatherdata;
}

我想返回天气数据,但在完成 AsynTask 之后。可能需要几秒钟。

4

2 回答 2

1

创建 AsyncTask 的原因不是为了在 UI 线程上运行。return 语句是 UI 线程的一部分,因此 return 语句将始终返回 null,因为它会在后台线程启动时继续执行代码。

你有两种可能:

1-您在 UI Tread 上运行您的代码,您的应用程序会卡在此函数中,直到它到达 return 语句并返回变量的计算值。请不要那样做。

2-这是我会做的。不要从此函数返回任何内容,因此将其更改为 return void,删除 return 语句,调用 asynctask 并从 onPostExecute 调用一个函数,该函数将操纵您在 doInBackground 上赋值的变量。

我看不到你在哪里做 doInBackground 但它是必须完成任务的地方,所以实现它并在那里给你的变量赋值,不要再为空。

于 2013-06-20T02:06:27.907 回答
1

一种解决方案是从return的值`onPostExecute()。您可以通过设置您AsyncTask的正常然后将您的return语句更改为类似

public String getWeather(Context cont,int cityid,String latitude, String longitude){
this.latitude=latitude;
this.longitude=longitude;

new get_scores() {
    protected void onPreExecute() {
        super.onPreExecute();

    }

    protected void onPostExecute(Boolean result) {

    }
}.execute();

  return new get_scores().execute();

}

这样做你可能会想要添加一个progress bar/dialog,这样用户就不会认为应用程序被卡住了。只要任务不超过 2 或 3 秒(最多)并且您不希望用户在完成之前能够做任何其他事情,那么这应该没问题。我会通过用 a 包围来进行一些错误检查,try/catch或者确保你返回一些东西以防应用程序无法返回

于 2013-06-21T14:02:38.810 回答