我目前正在编写一个程序来从服务器获取数据作为 xml 文件并将其存储在一个简单的数据库中并在谷歌地图上显示位置
我为 android 2.2 开发了该应用程序,并在模拟器中使用 android ICS 对其进行了测试。它按我的预期工作,但是当我在运行 android 4.04 的 android 设备上尝试时,应用程序卡住了
如果您知道为什么会发生这种情况,请帮助我谢谢
我目前正在编写一个程序来从服务器获取数据作为 xml 文件并将其存储在一个简单的数据库中并在谷歌地图上显示位置
我为 android 2.2 开发了该应用程序,并在模拟器中使用 android ICS 对其进行了测试。它按我的预期工作,但是当我在运行 android 4.04 的 android 设备上尝试时,应用程序卡住了
如果您知道为什么会发生这种情况,请帮助我谢谢
这个问题有两个解决方案,但我建议您使用第一个解决方案,因为第二个解决方案仅用于隐藏问题。
1)不要在主 UIThread 中编写网络调用,为此使用异步任务。
2) 在 setContentView(R.layout.activity_main); 之后将以下代码写入 MainActivity 文件;
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
并将下面的 import 语句放入您的 java 文件中。
import android.os.StrictMode;
@arcastro、@Stephan Celis、@Egor 和 @Mohan 非常感谢您的帮助。你所有的想法对我帮助很大。我添加了一个单独的线程来连接到网络并下载数据@Egor 你的问题让我意识到我做错了什么
谢谢你们
对于遇到相同问题的开发人员,我确实听说过我是如何做到的
在您的班级中放置在“updateHandler”代码下方
private Handler updateHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg.what == -999)
{
Log.d("recieve data","from http://jayanga.esplprojects.com/xx/data.xml to update");
DatabaseHandler db = new DatabaseHandler(getApplicationContext());
String xml = XML.getXML("http://jayanga.esplprojects.com/xx/data.xml");
Document doc = XML.XMLfromString(xml);
int numResults = XML.numResults(doc);
if((numResults <= 0)){
Toast.makeText(getApplicationContext(), "SORRY No data were found", Toast.LENGTH_LONG).show();
finish();
}//if((numResults <= 0))
NodeList nodes = doc.getElementsByTagName("result");
for (int i = 0; i < nodes.getLength(); i++) {
Element e = (Element)nodes.item(i);
// String s = "...."+XML.getValue(e, "name");
// Inserting Contacts
Log.d("Insert: ", "Inserting ..");
db.addContact(new Details(XML.getValue(e, "name"),Double.parseDouble( XML.getValue(e, "latitude"))
, Double.parseDouble(XML.getValue(e, "longitude")),XML.getValue(e, "contact") ));
}// for (int i = 0; i < nodes.getLength(); i++)
db.close();
Toast.makeText(getApplicationContext(), "Database Successfully Updated", Toast.LENGTH_LONG).show();
displayLocations();
}
}
};
然后从要运行线程的位置调用 updateHandler
int get_update_data = -999;
Message theMessage = updateHandler .obtainMessage(get_update_data);
updateHandler.sendMessage(theMessage);//Sends the message to the UI handler.
从android 2.3版本严格模式开发,它不会允许来自服务器的xml文件等数据,然后你可以添加一些代码。
if (android.os.Build.VERSION.SDK_INT > 8) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
if you can add the above code then you can check in 4.0 version mobile, it will work happy.