AsyncTask返回对象困难Android Studio



我正在尝试使用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在后台线程中执行异步执行的任务。任务执行后得到结果的两种方法:

  1. 使用blahblah.execute("");并在PostExecute 中获取结果

    @Override
    protected void onPostExecute(MapInfo mapInfo) {
    super.onPostExecute(mapInfo);
    String polyline = mapInfo.polyline;
    }
    

  2. 像一样使用

    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();

相关内容

最新更新