私は現在、サーバーからデータをxmlファイルとして取得し、それを単純なデータベースに保存し、Googleマップに場所を表示するプログラムを書いています
Android 2.2用のアプリを開発し、エミュレーターでAndroid ICSでテストしました。期待どおりに機能しましたが、Android 4.04 を実行している Android デバイスで試してみると、アプリケーションが動かなくなりました。
なぜそのようなことが起こったのか考えられる場合は、私を助けてくださいありがとう
私は現在、サーバーからデータをxmlファイルとして取得し、それを単純なデータベースに保存し、Googleマップに場所を表示するプログラムを書いています
Android 2.2用のアプリを開発し、エミュレーターでAndroid ICSでテストしました。期待どおりに機能しましたが、Android 4.04 を実行している Android デバイスで試してみると、アプリケーションが動かなくなりました。
なぜそのようなことが起こったのか考えられる場合は、私を助けてくださいありがとう
@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.
この問題には 2 つの解決策がありますが、最初の解決策を使用することをお勧めします。
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;
開発されたAndroid2.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.