2011-02-01 21 views
0

私のデータの場所を更新するバックグラウンドスレッドを作成する(自分のアクティビティが死んでも実行する)と、httpリクエスタを使ってサーバーに送信したい。しかし、それは例外を発生します。AsyncTaskでハンドラを呼び出せませんか?

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

@ user40574:こんにちは、もっと明確な方法で問題を説明してください。Logcatやforeroundスレッドで何か期待していますか?データを更新できませんでしたか????????????????? ????/ –

+0

私はlogcatで自分の投稿を更新しました。 – user420574

答えて

2

EDIT:asyncTaskの代わりにServiceを使用する必要があると思います。

正確に。別個のスレッドを作成しても、アプリケーション/アクティビティが終了したとき、またはオペレーティングシステムがより多くのリソースを必要とするときに、スレッドが強制終了されないことは保証されません。 Serviceは、システムが本当に負荷の高い状態でもまだ殺される可能性はありませんが、その可能性は非常に低いです。また、(私が間違っている場合は私を修正してください)、システムの負荷が緩やかになったらAndroidはサービスを再起動します。

+0

サービスの代わりにタイマー(http://developer.android.com/reference/java/util/Timer.html)を使用するのはどうですか? – Flo

+0

@Floタイマーがどのように役立つのか分かりません。 Androidがあなたのプロセスを殺すのを止めることはありません。 – Felix

+0

Mh、私はタイマーが定期的にいくつかの機能をトリガーできるcronジョブオブジェクトと見なすことができ、アプリケーションが動作していなくてもこの機能を呼び出すことができると考えました。私は、このアクティビティのアプリケーションは動作していませんが、活動を開始できる放送受信機のような私の心の中に何かを持っていました。タイマーはアプリケーションに直接バインドされていますか?もちろん、あなたは正しいですが、これではこの問題は解決しません。 – Flo

0

Threadを実行する前に、電話番号Looper.prepare()に電話してください(コードに書き留めてください)。 (それは簡単な解決策だが、以前にあまりにも私は奇妙製。)

あなたは、まず、あなたのActivityであるHandlerを呼び出すことができない場合は、たとえば、あなたの活動のコンストラクタを作る必要があります。

public SampleActivity() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 
あなたの ASyncTask

その後、Activityことを開始します

SampleActivity sampleAct = new SampleActivity(); 

、最終的なキックは、あなたのHandlerを呼んでいます。

sampleAct.handler.sendMessage(msg); 

これがあなたにはっきりと分かりたいと思います。

関連する問題