【发布时间】:2012-03-01 10:25:10
【问题描述】:
我仍在学习 Java/Android 开发,我需要一些指导来实现异步任务。我主要不确定在我的程序中从哪里开始。我在下面概述了一些代码,有人可以告诉我在哪里以及如何实现该任务吗?我的应用程序每秒将 GPS 坐标发送到数据库,我需要一个单独的任务,这样我就不会陷入主线程并冒 ARN 错误的风险。这是我的代码:
第一个区块来自我的主要活动。当按下按钮时,启动三秒倒计时,当它完成时(onFinish),用户数据被发送到一个数据库(SendUserActivity.sendId...,这实际上是一个类,而不是一个活动,只是名字不好)和应用程序然后开始跟踪用户并每秒将坐标发送到不同的数据库(location.startLocation...)(两个数据库以避免重复所有用户的数据)。
MainActivity.java:
public void onFinish() {
button.setText("SENT");
SendUserActivity.sendId(usr_id1, first, last);
location.startLocation(getBaseContext(), usr_id1);
这是来自LocationActivity 类的第二个代码块(也是一个类而不是一个活动,再次糟糕的命名)。它每秒请求一次位置更新,然后将其发布到 PHP 脚本,该脚本将其插入 MySQL 数据库。
public class LocationActivity {
private LocationManager locManager;
private LocationListener locListener;
public void startLocation(Context context, String usr_id2)
{
final String usr = usr_id2;
//get a reference to the LocationManager
locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//checked to receive updates from the position
locListener = new LocationListener() {
public void onLocationChanged(Location location) {
send(location, usr);
}
public void onProviderDisabled(String provider){
//labelState.setText("Provider OFF");
}
public void onProviderEnabled(String provider){
//labelState.setText("Provider ON ");
}
public void onStatusChanged(String provider, int status, Bundle extras){
//Log.i("", "Provider Status: " + status);
}
};
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locListener);
}
public void send(Location loc, String usr_id2) {
Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));
String lat = String.valueOf(loc.getLatitude());
String lon = String.valueOf(loc.getLongitude());
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://example.com/test/example.php");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("lat", lat));
nameValuePairs.add(new BasicNameValuePair("lon", lon));
nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
}
catch (ClientProtocolException e) {
// TODO Auto-generated catch block
}
catch (IOException e) {
// TODO Auto-generated catch block
}
}
}
重申我的问题,我将如何实现异步任务以将 GPS 信息发送到数据库?我读过 IntentServices,但有些人建议我使用异步任务。无论哪种方式,让我知道在哪里以及如何实施其中之一;我真的很感激。谢谢!
【问题讨论】:
-
基本上所有需要等待外部系统,手机外部的东西都需要异步。对于您的情况, send() 需要异步。
标签: java android multithreading android-asynctask