我正在尝试使用AsyncTask
进行API调用,并将响应映射到名为MapInfo
的对象,该对象是MainActivity
中的一个变量。然后我使用这个MapInfo
的字段,命名为折线,并使用预先构建的URL编码器在不同的API调用中使用。我遇到的问题是,我让AsyncTask
返回PostExecute()
中的MapInfo
对象,但MainActivity
上的代码仍在继续执行,在继续执行代码之前,我需要先返回MapInfo
对象。
这在MainActivity
:中
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.
}
}
字符串多段线为空,并在API调用中使用。在将多段线分配给返回的对象之前,我应该如何"等待"AsyncTask
完成?
注意:上面的块是伪代码。
编辑:
我在执行后分配了字符串poly,但仍然发生了同样的错误。我所做的不仅仅是在MainActivty
中使用String多ine,我还在MainActivity
中使用返回的MapInfo
对象来分配TextViews
,然后在不同的API调用中使用折线来下载图像。由于我只需要整个JSONobject
中的4个字段,因此我是否应该从AsyncTask
更改为仅使用API调用?
RED箭头试图在MainActivity
中分配。
蓝色箭头尝试在OnPostExecute
中分配。
安卓工作室剪辑点击我
AsyncTask
在后台线程中执行异步执行的任务。任务执行后得到结果的两种方法:
-
使用
blahblah.execute("");
并在PostExecute 中获取结果@Override protected void onPostExecute(MapInfo mapInfo) { super.onPostExecute(mapInfo); String polyline = mapInfo.polyline; }
或
-
像一样使用
MapInfo mapInfo = blahblah.execute("").get(); String polyline = mapInfo.polyline;
这样就不需要在onPostExecute(-(中捕获结果
AsyncTask
将在后台线程中执行异步执行的任务。在new AsyncTask blah = blahblah.execute("");
之后立即放置String polyline = mapInfo.polyline;
将立即执行它,因为控制将触发AsyncTask
并继续执行下一语句
如果您需要在任务执行后执行String polyline = mapInfo.polyline;
,则将其放置在onPostExecute()
中,如下所示:
@Override
protected void onPostExecute(final MapInfo mapInfo) {
super.onPostExecute(mapInfo);
...
final String polyline = mapInfo.polyline;
}
不应将AsyncTask
用于API调用,因为API服务(改装、Volley等(已在后台线程中工作。
由于AsyncTask
和API调用服务在不同的线程中工作,因此不会相应地更新数据。
相反,您应该使用API的方法onSuccess
方法来设置MainActivity
中的结果
AsyncTask将在单独的线程中处理,主线程继续到下一行。MapInfo对象尚未与API数据一起存储,因此它的多段线为空。
这样尝试
单击按钮时,启动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();