我正在尝试创建一个应用程序,它通过GPS获取我的地理位置并将其发送到数据库。一切正常,直到我第二次尝试更新我的地理位置。 我通过ubuntu终端将数据发送到模拟器。 当我第一次发送它时,它将map导入到该点,并将正确的数据插入到数据库中,但是当我尝试第二次发送数据时,它显示“不幸的是,应用程序已停止”)
我以这种方式发送数据:
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();
}
}
答案 0 :(得分:1)
你应该使用
new Insert(..).execute();
每次你想要启动AsyncTask。根据定义,AsynTask只运行一次。
由于您只创建一次Insert对象,如果您尝试再次运行该实例,您的应用程序将会崩溃。
如果你需要将参数或数据传递给Insert,你应该编写一个新的构造函数,接受这些参数然后以这种方式调用它:
new Insert(longitude,latitude).execute();