无法在AsyncTask中调用处理程序?

时间:2011-02-01 08:34:41

标签: android multithreading handler android-asynctask loc

我想创建一个后台线程(即使我的活动死了也执行),更新我的数据位置,并使用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。

2 个答案:

答案 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);

我希望这清楚地向你解释。