2016-07-12 26 views
0

ハンドラを介してGPS座標を取得しようとしています。コードは以下のとおりです。バックグラウンドでGPS座標を取得できません(ハンドラを使用して) - Android

final Thread ObainGpsBackground = new Thread(new Runnable() { 

      @Override 
      public void run() { 
        try{ 
         String SetServerString = ""; 
         //Obtaining GPS co-ordinates : 
         LatLong obj_latLong = new LatLong(getActivity()); 
         addressList = obj_latLong.getListAddressFromGeocoder(getActivity()); 

         //Setting the addressList.getLatitude() into a variable "SetServerString" 
         for (Address address : addressList) { 
          SetServerString = String.valueOf(address.getLatitude()); 
          threadMsg(SetServerString); 
         } 
         //Obtaining GPS co-ordinates : 
        } 
        catch(Throwable t){ 
        Log.i("Exception","Getting GPS exception : "+t); 
       } 
      } 
     }); 

何とかコードは常にキャッチブロックに向かっています。私はこのエラーを取得するすべて:さまざまな記事を見

private void threadMsg(String setServerString) { 
     if (!setServerString.equals("") && !setServerString.equals("0")) { 
      Message msgObj = handler.obtainMessage(); 
      Bundle b = new Bundle(); 
      b.putString("message", setServerString); 
      msgObj.setData(b); 
      handler.sendMessage(msgObj); 
     } 
    } 

    private final Handler handler = new Handler() { 

     public void handleMessage(Message msg) { 

      String aResponse = msg.getData().getString("message"); 

      if ((null != aResponse)) { 

       // ALERT MESSAGE 
//    alert_attendance(getResources().getString(R.string.warning), getResources().getString(R.string.ects)); 
       Toast.makeText(getActivity(), "Response: "+aResponse, Toast.LENGTH_SHORT).show(); 
      } 
      else 
      { 

       // ALERT MESSAGE 
       alert_attendance(getResources().getString(R.string.warning), getResources().getString(R.string.unableToFindLocation)); 
//    Toast.makeText(getBaseContext(), "Not Got Response From Server.", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    }; 

I/Exception: Getting GPS exception : java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

ここでは、ハンドラです。何とかそれを理解することができません。 looper.prepare()を正確に実装するには?何か案は ?何LooperThreadによって作成されず、作製したので

+0

@Tim編集しました。コードが投稿中に何とか削除されました。 – TechFrk

+0

どのラインで問題が発生していますか?完全なクラッシュログを表示する –

+0

私は自分のコードで言いました: 'catch(Throwable t){ Log.i(" Exception "、" GPS例外の取得 "+ t);'コンパイラはこのブロックを実行しています。それは私が得ているすべてのクラッシュログです。 – TechFrk

答えて

0

これが起こっている、それがメッセージを受け取ることができるようにHandlerLooperが必要です。完全なコードを見落とすのは難しいですが、本質的に何が起きているのかは、Handlerが作成されているとき(それがメンバーであるクラスをロードするとき - threadMsgのように見えます)、それはあなたのカスタムスレッドで起こっています。

あなたのUIを更新する予定の場合は、ActivityまたはFragmentコードを更新して、パブリックメソッドを公開してGPSに基づくアップデートを提供することをおすすめします。さらに良いことに、カプセル化は、イベントが発生したときに、あなたのGPSの背景労働者が何かをコールバックするためのインタフェースを定義持っているだろう:

public interface GpsEventListener { 
    void gpsEventReceived(int type, String data); 
} 

は持っているあなたのActivityFragmentこのインタフェースを実装し、それらをメインスレッド上で実行されますHandlerを作成しています:

public class MyGpsActivity extends Activity implements ThreadMsg.GpsEventListener, Handler.Callback { 
    ... 
    private Handler handler = new Handler(this); 

    public boolean handleMessage(Message msg) { 
     /* do work here */ 
    } 

    public void gpsEventReceived(int type, String data) { 
     Message msg = Message.obtain(handler, type, data); 
     msg.sendToTarget(); 
    } 
} 

バックグラウンドスレッドの開始/停止とメインスレッドとの対話には十分注意してください。 Threadオブジェクトはライフサイクルに対応していないため、ActivityまたはFragmentが一時停止すると、UIコンポーネントが更新されなくなり、バックグラウンドワーカーを停止する必要があります。

このようなポーリングではなく、GPSデータの非同期通知を使用することもお勧めします。それ以外の場合は、CPUとバッテリーを大量に使用します。

関連する問題