Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask返回对象到Android Studio_Java_Android_Android Asynctask - Fatal编程技术网

Java AsyncTask返回对象到Android Studio

Java AsyncTask返回对象到Android Studio,java,android,android-asynctask,Java,Android,Android Asynctask,我正在尝试使用AsyncTask进行API调用,并将响应映射到我命名为MapInfo的对象,该对象是MainActivity中的一个变量。然后,我使用这个名为polyline的MapInfo字段,并使用预构建的URL编码器在不同的API调用中使用。我遇到的问题是,我让AsyncTask在PostExecute()中返回MapInfo对象,但是MainActivity上的代码继续执行,我需要在继续执行代码之前先返回MapInfo对象 这在main活动中: public static MapInfo

我正在尝试使用
AsyncTask
进行API调用,并将响应映射到我命名为
MapInfo
的对象,该对象是
MainActivity
中的一个变量。然后,我使用这个名为polyline的
MapInfo
字段,并使用预构建的URL编码器在不同的API调用中使用。我遇到的问题是,我让
AsyncTask
PostExecute()
中返回
MapInfo
对象,但是
MainActivity
上的代码继续执行,我需要在继续执行代码之前先返回
MapInfo
对象

这在
main活动中:

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. 
    }
}
publicstaticmapinfo-MapInfo=newmapinfo();
OnCreate(){
button.setonClick(){
//一些东西
新建AsyncTask blah=blahblah.execute(“”);
//上面返回一个单一的MapInfo对象并将其指定给MapInfo

String polyline=mapInfo.polyline;//
AsyncTask
将在后台线程中执行异步执行的任务。将
String polyline=mapInfo.polyline;
放在
新异步任务blah=blahblah.execute(“”)之后;
将立即执行它,因为控件将触发
异步任务
并继续执行下一个语句

如果在执行任务后需要执行
String polyline=mapInfo.polyline;
,请将其放置在
onPostExecute()
中,如下所示:

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

AsyncTask
将在后台线程中执行异步执行的任务。将
字符串polyline=mapInfo.polyline;
紧跟在
new AsyncTask blah=blahblah.execute(“”)之后;
将立即执行它,因为控件将触发
异步任务
并继续执行下一个语句

如果在执行任务后需要执行
String polyline=mapInfo.polyline;
,请将其放置在
onPostExecute()
中,如下所示:

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

您不应该对API调用使用
AsyncTask
,因为API服务(改装、截击等)已经在后台线程中工作

由于
AsyncTask
和API调用服务在不同的线程中工作,因此数据不会相应地更新


相反,您应该使用API的方法
onSuccess
main活动中设置结果

您不应该使用
AsyncTask
进行API调用,因为API服务(改装、截击等)已经在后台线程中工作

由于
AsyncTask
和API调用服务在不同的线程中工作,因此数据不会相应地更新


相反,您应该使用API的方法
onSuccess
来设置
MainActivity

AsyncTask
在异步执行的后台线程中执行任务。 执行任务后获得结果的两种方法:

  • 使用
    blahblah.execute(“”;
    并在onPostExecute中获取结果

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

  • MapInfo mapInfo = blahblah.execute("").get();
    String polyline = mapInfo.polyline;
    
    这样,就不需要捕捉onPostExecute(-)中的结果


  • AsyncTask
    在后台线程中执行异步执行的任务。 执行任务后获得结果的两种方法:

  • 使用
    blahblah.execute(“”;
    并在onPostExecute中获取结果

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

  • MapInfo mapInfo = blahblah.execute("").get();
    String polyline = mapInfo.polyline;
    
    这样,就不需要捕捉onPostExecute(-)中的结果


  • 异步任务将在单独的线程中处理,主线程继续到下一行。 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();
    
    newasynctask(){
    @凌驾
    受保护的MapInfo doInBackground(字符串…字符串){
    mapinfom=null;
    试一试{
    //Mapinfo api的处理
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回m;
    }
    @凌驾
    受保护的void onPostExecute(MapInfo信息){
    mapInfo=info;
    如果(mapInfo!=null){
    //分配给文本视图
    //下载图像任务(后台线程)
    }
    }
    }.execute();
    
    异步任务将在单独的线程中处理,主线程继续到下一行。 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();
    
    newasynctask(){
    @凌驾
    受保护的MapInfo doInBackground(字符串…字符串){
    mapinfom=null;
    试一试{
    //Mapinfo api的处理
    }捕获(例外e){
    e、 printStackTrace();
    }
    返回m;
    }
    @凌驾
    受保护的void onPostExecute(MapInfo信息){
    mapInfo=info;
    如果(mapInfo!=null){
    //分配给文本视图
    //下载图像任务(后台线程)
    }
    }
    }.execute();
    
    这个问题是网络连接。它抛出了一个错误B/C,它不能在主线程上运行。我试着用一个叫做run的方法使AssicTebug成为一个类,但是它抛出了这个错误。我可以走这条路线,但是它将是解决问题的一个创可贴,而不是一个解决方案。这个问题是网络连接。HORE错误B/C它不能在主线程上运行。我试着用一个叫做run的方法来做AssiCtaskA类,但是它抛出了这个错误。我可以走这条路线,但是它会是一个更多的带帮助T。