我正在构建一个使用谷歌地图覆盖项目的Android应用程序。我从MySQL数据库获取的项目的纬度和经度。为此,我在Async Task中使用HTTP连接到php脚本。我在地图上显示项目的代码位于Async Task的onPostExecute()方法中。
一切正常但是当我例如旋转手机时,所有叠加的项目都会消失。我该如何解决这个问题?
是否应该在主线程中覆盖项目?如果是这样,我需要以某种方式将信息从异步接收传递到主线程,我已经研究过,但是无法使其正常工作。如果有人知道这样做的正确方法,我真的很感激帮助。
答案 0 :(得分:2)
OnPostExecute 在主线程中调用它! 您的问题是旋转手机时
Android重新启动正在运行的Activity(调用onDestroy(),然后调用onCreate())。重新启动行为旨在通过使用与新设备配置匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新配置。
。http://developer.android.com/guide/topics/resources/runtime-changes.html
答案 1 :(得分:1)
使用活动类的onSaveInstanceState(Bundle outstate)
和onRestoreInstanceState(Bundle savedInstanceState)
。
答案 2 :(得分:1)
异步任务是你的线程,其中onpost方法是默认附加主UI线程它不是Async问题你只需要处理onConfigurationChanged方法,最好发布一些代码。
答案 3 :(得分:1)
如上所述,当您更改轮换时,android会重新启动您的活动。因此解决方法是在onSaveInstenceState中存储覆盖项数据,在onRestoreInstanceState中,您应该根据保存的数据重新创建覆盖项
答案 4 :(得分:1)
创建一个名为initUi()
的方法,并在onConfigurationChanged
和onCreate
这样的方法中调用它:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
try {
setContentView(...);
initUi();
} catch (Exception e) {
}
}
和
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_document);
initUi();
try {
} catch (Exception e) {
}
答案 5 :(得分:0)
正如其他答案所说,您可以使用onSaveInstanceState(Bundle outstate)和onRestoreInstanceState(Bundle savedInstanceState)来解决您的问题,甚至可以禁用设备中的方向更改。
让我们一个接一个地看:
- 禁用方向更改,可能会导致用户体验下降,因此我不赞成。
- 使用onSaveInstanceState(Bundle outstate)和onRestoreInstanceState(Bundle savedInstanceState)你有两个主要的oprions ......
选项1:
您只能保存有关正在显示的项目的基本信息(例如,如果它是地图,您可以保存地图中心位置和缩放),然后再从数据库中检索所有叠加信息。这很简单,但是如果要检索几百个叠加项目,它可能会非常慢,从而再次导致用户体验。
选项2:
您可以使用parcelable扩展覆盖项,以便在onSaveInstanceState(Bundle outstate)期间保存所有覆盖项,并在不从数据库重新加载的情况下恢复它们。我已经将它用于了几千个项目,而且效果很好。
您可以在此处找到可分辨的信息:Google以及此处的示例:Android – Parcel data to pass between Activities using Parcelable classes
祝你好运