Android应用程序:在AsyncTask中显示覆盖项

Android应用程序:在AsyncTask中显示覆盖项,android,android-asynctask,overlayitem,Android,Android Asynctask,Overlayitem,我正在构建一个android应用程序,它使用谷歌地图覆盖项目。我从MySQL数据库中获取的项目的纬度和经度。为此,我在异步任务中使用HTTP连接到一个php脚本。我在地图上显示项目的代码位于Async Task的onPostExecute()方法中 一切都很好,但当我旋转手机时,我所有的重叠项目都消失了。我如何解决这个问题 是否应该在主线程中覆盖项目?如果是这样的话,我需要以某种方式将信息从异步TAK传递到主线程,我已经研究了主线程,但无法使其工作。如果有人知道这样做的好方法,我将非常感谢您的帮

我正在构建一个android应用程序,它使用谷歌地图覆盖项目。我从MySQL数据库中获取的项目的纬度和经度。为此,我在异步任务中使用HTTP连接到一个php脚本。我在地图上显示项目的代码位于Async Task的onPostExecute()方法中

一切都很好,但当我旋转手机时,我所有的重叠项目都消失了。我如何解决这个问题


是否应该在主线程中覆盖项目?如果是这样的话,我需要以某种方式将信息从异步TAK传递到主线程,我已经研究了主线程,但无法使其工作。如果有人知道这样做的好方法,我将非常感谢您的帮助。

使用
onSaveInstanceState(Bundle outstate)
onRestoreInstanceState(Bundle savedInstanceState)
活动类。

异步任务是您的线程,其中onpost方法是默认的与主UI线程连接。它不是异步问题,您只需要处理OnConfiguration更改的方法,最好发布一些代码。

OnPostExecute它是在主线程中调用的! 你的问题是当你旋转手机时

Android重新启动正在运行的活动(调用onDestroy(),后跟onCreate()。重新启动行为旨在通过使用与新设备配置匹配的替代资源自动重新加载应用程序,帮助应用程序适应新配置


.

如前所述,当您更改轮换时,android将重新启动您的活动。因此,解决方案是在onSaveInstenceState中,您应该存储覆盖项数据,而在onRestoreInstanceState中,您应该基于保存的数据重新创建覆盖项,创建一个名为
initUi()
的方法,并在
OnConfiguration Changed
onCreate
中调用它,如以下方法:

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        try {
            setContentView(...);
            initUi();               
        } catch (Exception e) {

        }
    }


正如其他答案所述,您可以使用onSaveInstanceState(Bundle outstate)和onRestoreInstanceState(Bundle savedInstanceState)甚至禁用设备中的方向更改来解决问题

让我们逐一看看:

-禁用方向更改可能会导致用户体验下降,所以我不赞成这样做

-使用onSaveInstanceState(Bundle outstate)和onRestoreInstanceState(Bundle savedInstanceState),您有两个主要操作

备选案文1:

您只能保存有关显示项目的基本信息(即,如果是地图,则可以保存地图中心位置和缩放),然后再次从数据库检索所有覆盖信息。这很简单,但如果要检索几百个覆盖项,可能会非常慢,从而再次带来用户体验

备选案文2:

您可以使用parcelable扩展覆盖项,以便在onSaveInstanceState(Bundle outstate)期间保存所有覆盖项,并在不从数据库重新加载的情况下恢复它们。我已经用它处理了几千件物品,效果很好

您可以在以下位置找到包裹信息:和示例:

祝你好运

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_document);
            initUi();  

        try {
            } catch (Exception e) {

        }