0

GPS 経由で地理的位置を取得し、データベースに送信するアプリケーションを作成しようとしています。地理的位置を 2 回目に更新しようとするまで、すべて正常に動作します。ubuntu端末経由でエミュレータにデータを送信しています。最初に送信すると、そのポイントにマップが送信され、適切なデータがデータベースに挿入されますが、2回目にデータを送信しようとすると、「残念ながら、アプリケーションは停止しました」と表示されます)

私はそのようにデータを送信します:

telnet localhost 5554
geo fix 100 100

コード

public class LocationActivity extends MapActivity implements LocationListener { 
...
  InsertToDatabase Insert = new InsertToDatabase();

      @Override
  public void onLocationChanged(Location location) {

      Insert.latitude = location.getLatitude();
      Insert.longitude = location.getLongitude();
      Insert.execute();

    try {
      List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 10); 
      for (Address address : addresses) {
        this.locationText.append("\n" + address.getAddressLine(0));
      }

      int latitude = (int)(location.getLatitude() * 1000000);
      int longitude = (int)(location.getLongitude() * 1000000);

      GeoPoint point = new GeoPoint(latitude,longitude);
      mapController.animateTo(point); 

    } catch (IOException e) {
      Log.e("LocateMe", "Could not get Geocoder data", e);
    }
  }

InsertToDatabase クラス (LocationActivity クラスのサブクラス)

    class InsertToDatabase extends AsyncTask<String, String, String> {

        Double latitude;
        Double longitude;

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(LocationActivity.this);
            pDialog.setMessage("Creating Product..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Creating product
         * */
        protected String doInBackground(String... args) {

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("longitude", this.longitude.toString()));
            params.add(new BasicNameValuePair("latitude", this.latitude.toString()));

            // getting JSON Object
            // Note that create product url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                    "POST", params);

            // check log cat fro response
            Log.d("Create Response", json.toString());

            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {


                } else {

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }

    }
4

1 に答える 1

1

使用する必要があります

new Insert(..).execute(); AsyncTask を開始するたびに。定義により、AsynTask は 1 回だけ実行されます。

Insert オブジェクトは 1 回しか作成しないため、そのインスタンスをもう一度実行しようとするとアプリがクラッシュします。

パラメーターまたはデータを Insert に渡す必要がある場合は、新しいコンストラクターを作成し、これらのパラメーターを取得してから、次のように呼び出す必要があります。

new Insert(longitude,latitude).execute();
于 2012-09-07T13:33:10.993 に答える