我正在尝试使用AsyncTask
进行API调用并将响应映射到我命名为MapInfo
的对象,该对象是MainActivity
中的变量。然后,我使用此MapInfo
的字段(称为折线),并使用预构建的URL编码器以在其他API调用中使用。我遇到的问题是我有AsyncTask
返回MapInfo
中的PostExecute()
对象,但是MainActivity
上的代码继续执行,并且我需要{ {1}}对象将首先返回,然后继续执行代码。
这是在MapInfo
中:
MainActivity
字符串折线为null,并且在以后的API调用中使用。将多义线分配给返回的对象之前,我应该如何“等待” public static MapInfo mapInfo = new MapInfo();
OnCreate() {
button.setonClick() {
//some stuff
new AsyncTask blah = blahblah.execute("");
//the above returns a singular MapInfo object and assigns it to mapInfo
String polyline = mapInfo.polyline; //<--This is where the issue is.
}
}
完成?
注意:上面的块是伪代码。
编辑:
我在执行后分配了字符串poly,但是仍然发生相同的错误。我所做的不只是在AsyncTask
中使用String polyine,还在MainActivty
中使用返回的MapInfo
对象来分配MainActivity
,然后在其他API中使用折线致电下载图片。因为我只需要整个TextViews
中的4个字段,我应该从AsyncTask
更改为API调用吗?
JSONobject
中分配RED 箭头。
尝试在MainActivity
中分配BLUE 箭头。
答案 0 :(得分:1)
AsyncTask
将在异步执行的后台线程中执行任务。将String polyline = mapInfo.polyline;
放在new AsyncTask blah = blahblah.execute("");
之后立即执行,因为控制会触发AsyncTask
并继续执行下一条语句
如果在执行任务后需要执行String polyline = mapInfo.polyline;
,则将其放置在onPostExecute()
中,如下所示:
@Override
protected void onPostExecute(final MapInfo mapInfo) {
super.onPostExecute(mapInfo);
...
final String polyline = mapInfo.polyline;
}
答案 1 :(得分:1)
AsyncTask
在异步执行的后台线程中执行任务。
任务执行后获得结果的两种方法:
使用blahblah.execute("");
并在onPostExecute内获取结果
@Override
protected void onPostExecute(MapInfo mapInfo) {
super.onPostExecute(mapInfo);
String polyline = mapInfo.polyline;
}
OR
用法类似
MapInfo mapInfo = blahblah.execute("").get();
String polyline = mapInfo.polyline;
通过这种方式,无需在onPostExecute(-)
答案 2 :(得分:0)
您不应使用print('If there was a birth every 7 seconds, there would be: %d births' %(births))
# Will replace %d with births
进行API调用,因为API服务(Retrofit,Volley等)已在后台线程中工作。
由于AsyncTask
和API调用服务在不同的线程中工作,因此不会相应地更新数据。
相反,您应该使用API的方法AsyncTask
在onSuccess
中设置结果
答案 3 :(得分:0)
AsyncTask将在单独的线程中处理,主线程继续到下一行。 MapInfo对象尚未与API数据一起存储,因此它的折线为null。
尝试
单击按钮后,启动AsyncTask加载MapInfo。在onPostExecute()中,您的剩余工作是否像分配给文本视图和下载图像一样。
new AsyncTask<String, Void, MapInfo>() {
@Override
protected MapInfo doInBackground(String... strings) {
MapInfo m = null;
try {
//handling of Mapinfo api
} catch (Exception e) {
e.printStackTrace();
}
return m;
}
@Override
protected void onPostExecute(MapInfo info) {
mapInfo = info;
if (mapInfo != null) {
//assign to textviews
//download image task (background thread)
}
}
}.execute();