0

シンプルな GPS トラッカーを作成しています。アプリケーションは gps 緯度/経度を取得し、リモート サーバー上の php に送信します。

@Override

public void onLocationChanged(Location loc)
{
   String infLat = Double.toString(loc.getLatitude());
   String infLon = Double.toString(loc.getLongitude());

   String Text = "My current location is: " +
     "Latitud = " + infLat +
     "Longitud = " + infLon;

   Toast.makeText( getApplicationContext(),
                   Text,
                   Toast.LENGTH_SHORT).show();

   uploadLoc(infLat, infLon); // calling method which sends location info
}

そしてここにuploadLocがあります:

public void uploadLoc(String a, String b) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://link to script");

    try {

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("latitude", a));
        nameValuePairs.add(new BasicNameValuePair("longitude", b));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
        //
    } catch (IOException e) {
       //
    }
}

しかし、「アプリケーションが停止しました」というメッセージが頻繁に表示されます。uploadLoc メソッドを呼び出している行を削除すると、すべてが機能し、場所が変更されると Toast が更新されます。ここで何が問題なのですか?

4

1 に答える 1

0

HTTP 投稿を別のスレッドに入れます。

場所をリモートサーバーに投稿しようとするたびに、時間がかかり、最終的にonLocationChanged(Location loc)実行がブロックされる可能性があります。次回は LocationListener によって呼び出されます。

場所の更新を受信するたびに新しいスレッドを開始してみてください。解決策の問題は、場所の更新を受信する頻度に基づいて、スレッドが非常に多くなる可能性があることです。しかし、1 時間ごとに位置情報の更新を要求している場合、これは悪い考えではないかもしれません。

または、すべてのネットワーク ポスティング リクエストをキューに入れて、1 つずつ処理することもできます。IntentServiceを使用することもできますし、要件に合わせて他の設計パターンに従うこともできます。

キーは、ネットワーク操作を非同期に処理することです。このような操作には時間がかかり、この間、実行する他のキー操作をブロックしません。

于 2013-04-01T01:27:10.223 に答える