4

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

一切正常,但是当我旋转手机时,所有覆盖的项目都消失了。我该如何解决这个问题?

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

4

6 回答 6

2

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

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

. http://developer.android.com/guide/topics/resources/runtime-changes.html

于 2012-09-29T09:36:31.517 回答
1

create a method named initUi() and call it in onConfigurationChanged and onCreate methods like this:

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

        }
    }

and

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

        try {
            } catch (Exception e) {

        }
于 2012-09-29T09:56:21.893 回答
1

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

于 2012-09-29T09:31:13.187 回答
1

异步任务是您的线程,其中 onpost 方法默认附加到主 UI 线程,它不是异步问题,您只需要处理 onConfigurationChanged 方法,最好发布一些代码。

于 2012-09-29T09:32:35.183 回答
1

如前所述,当您更改旋转时,android 会重新启动您的活动。因此,解决方案是在 onSaveInstenceState 中,您应该存储叠加项目数据,在 onRestoreInstanceState 中,您应该根据保存的数据重新创建叠加项目

于 2012-09-29T09:43:25.403 回答
0

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

让我们一一来看:

-禁用方向更改,可能会导致用户体验不佳,所以我不赞成它。

- 使用 onSaveInstanceState(Bundle outstate) 和 onRestoreInstanceState(Bundle savedInstanceState) 你有两个主要的选项......

选项1:

您可以仅保存有关正在显示的项目的基本信息(即,如果它是地图,您可以保存地图中心位置和缩放),然后再次从数据库中检索所有覆盖信息。这非常简单,但是如果您要检索数百个叠加项目,它可能会变得非常缓慢,从而再次导致用户体验不佳。

选项 2:

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

您可以在此处找到可打包信息:Google 和此处的示例:Android – 使用 Parcelable 类在活动之间传递的包裹数据

祝你好运

于 2012-09-29T10:58:59.770 回答