AsyncTask返回对象困难Android Studio

时间:2018-07-18 02:29:31

标签: java android android-asynctask

我正在尝试使用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 箭头。

snip from Android Studio CLICK ME

4 个答案:

答案 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在异步执行的后台线程中执行任务。     任务执行后获得结果的两种方法:

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

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

    OR

  2. 用法类似

    MapInfo mapInfo = blahblah.execute("").get();
    String polyline = mapInfo.polyline;
    

    通过这种方式,无需在onPostExecute(-)

  3. 中捕获结果

答案 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​​的方法AsyncTaskonSuccess中设置结果

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