我有一个返回String的函数,里面有一个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之后返回weatherdata。可能需要几秒钟。
答案 0 :(得分:1)
创建AsyncTask的原因不是在UI线程上运行.return语句是UI线程的一部分,因此return语句将始终返回null,因为它在后台线程启动时继续执行代码。
您有两种可能性:
1 - 您在UI Tread上运行代码,您的应用程序在此函数中停滞不前,直到它到达return语句并返回变量的计算值。请不要这样做。
2 - 这就是我要做的。不要从此函数返回任何内容,因此将其更改为返回void,删除return语句,调用asynctask,并从onPostExecute调用一个函数,该函数将操作您在doInBackground上赋值的变量。
我没有看到你在做什么doInBackground但是它必须在那里完成任务,所以实现它并在那里给你的变量赋值不再为null。
答案 1 :(得分: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秒(最多)并且您不希望用户在完成之前能够执行任何其他操作,那么这应该没问题。并且我会通过使用try/catch
进行一些错误检查,或者确保在应用无法返回的情况下返回某些内容