我想创建一个后台线程(即使我的活动死了也执行),更新我的数据位置,并使用http resquest将其发送到我的服务器。但它发生了一个例外:
02-01 07:50:18.172: ERROR/Exception1(277): Can't create handler inside thread that has not called Looper.prepare()
我的代码:
public class Messagerie extends Activity {
private LocationManager locationManager;
private String locationProvider = LocationManager.NETWORK_PROVIDER;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.messagerie);
new UpdateLocation().execute();
}
public void majCoordonnes() {
StringBuilder stringBuilder = new StringBuilder("Fournisseur :");
stringBuilder.append("\n");
stringBuilder.append(locationProvider);
stringBuilder.append(" : ");
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
String lat = String.valueOf(latitude);
String lon = String.valueOf(longitude);
stringBuilder.append(latitude);
stringBuilder.append(", ");
stringBuilder.append(longitude);
//Send location to server in an AsyncTask
new sendLocation().execute(lat, lon);
} else {
stringBuilder.append("Non déterminée");
}
Log.d("MaPositionMaj", stringBuilder.toString());
}
/**
* Ecouteur utilisé pour les mises à jour des coordonnées
*/
class MajListener implements android.location.LocationListener {
public void onLocationChanged(Location location) {
majCoordonnes();
}
public void onProviderDisabled(String provider){
}
public void onProviderEnabled(String provider){
}
public void onStatusChanged(String provider, int status, Bundle extras){
}
};
//Requête GET, mise à jour des infos
private class UpdateLocation extends AsyncTask<String, Void, String> {
String resp;
@Override
protected String doInBackground(String... params) {
try {
//Recuperation Location
String locationContext = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(locationContext);
if (locationManager != null && locationProvider != null) {
majCoordonnes();
locationManager.requestLocationUpdates(locationProvider, 120000, 500, new MajListener());
}
} catch (Exception e){
Log.e("Exception1", e.getMessage());
}
return resp;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
// Things to be done before execution of long running operation. For example showing ProgessDialog
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
编辑:我想我必须使用服务而不是asyncTask。
答案 0 :(得分:2)
编辑:我想我必须使用服务而不是asyncTask。
正。创建单独的线程不会确保在应用程序/活动退出时或操作系统需要更多资源时不会终止它。 Service
并不能确保 - 如果系统负载很重,它可能仍会被杀死,但它的可能性要小得多。另外(如果我错了,请纠正我),Android会在系统加载软化后重启服务。
答案 1 :(得分:0)
在运行Looper.prepare()
之前,只需致电(在代码中写下来)Thread
。 (这是一个简单的解决方案,但之前让我很奇怪。)
如果您无法拨打Handler
中的Activity
,那么首先应该制作您的活动构造函数,例如:
public SampleActivity() {
super();
// TODO Auto-generated constructor stub
}
然后在ASyncTask
中,启动Activity
:
SampleActivity sampleAct = new SampleActivity();
最后一脚是打电话给你Handler
。
sampleAct.handler.sendMessage(msg);
我希望这清楚地向你解释。