Не удается вызвать обработчик в AsyncTask? - PullRequest
0 голосов
/ 01 февраля 2011

Я хочу создать фоновый поток (выполняемый, даже если моя активность умирает), который обновляет мое местоположение данных и отправляет его на мой сервер с запросом http.Но возникает исключение:

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 ]

2 голосов
/ 01 февраля 2011

РЕДАКТИРОВАТЬ: я думаю, что я должен использовать службу вместо asyncTask.

Точно. Создание отдельного потока не гарантирует, что оно не будет уничтожено при выходе из приложения / действия или когда операционной системе требуется больше ресурсов. Service также не гарантирует этого - он все еще может быть убит, если система находится под очень большой нагрузкой, но это гораздо менее вероятно. Также (поправьте меня, если я ошибаюсь), Android перезапустит Службу, как только нагрузка на систему уменьшится.

0 голосов
/ 06 марта 2012

Просто позвоните (запишите это в своем коде) Looper.prepare(), прежде чем запустить Thread.(Это простое решение, но раньше я тоже делал это странно.)

Если вы не можете вызвать Handler, который находится в вашем Activity, то, во-первых, вы должны сделать свой конструктор активности, например,:

public SampleActivity() {
    super();
    // TODO Auto-generated constructor stub
}

затем в вашем ASyncTask инициируйте Activity:

SampleActivity sampleAct = new SampleActivity();

, и последний удар - это ваш Handler.

sampleAct.handler.sendMessage(msg);

Надеюсь, вам это ясно объясняется.

...