2016-12-21 1 views
1

をLooper.prepare(と呼ばれていないスレッド内のハンドラを作成できませんこれは、locationManagerの.requestLocationUpdatesを呼び出すときに発生します。これをメインのUIスレッドにどのように入れることができるのか分かりません。ここでエラーが発生したサービスのコードは次のとおりです。ここでは私がロケーションマネージャで働いています初めてですし、私はいつも同じエラーが出るサービスにlocationManager上)

public class TrackerService extends Service { 
    private Context mContext; 
    private LocListener mlocListener; 
    private LocationManager mlocManager; 
    private final IBinder myBinder = new MyLocalBinder(); 

    public void initiateTracking() { 
     this.mContext = getApplicationContext(); 
     mlocManager = (LocationManager) this.mContext.getSystemService(Context.LOCATION_SERVICE); 
     mlocListener = new LocListener(); 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
    } 

    public Boolean getGPSStatus(){ 
     return mlocManager.isProviderEnabled(mlocManager.GPS_PROVIDER); 
    } 

    public Double[] getCurrentLocation(){ 
     Double[] lonLat = new Double[]{mlocListener.getLon(), mlocListener.getLat()}; 
     Log.d("DEBUG", "getCurrentLocation: " + lonLat); 
     return lonLat; 
    } 

    public class MyLocalBinder extends Binder { 
     public TrackerService getService() { 
      return TrackerService.this; 
     } 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return myBinder; 
    } 
    @Override 
    public void onCreate() 
    { 
     isRunning = true; 
    } 
    @Override 
    public int onStartCommand(final Intent intent, int flags, int startId) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       initiateTracking(); 
      } 
     }).start(); 

     return Service.START_STICKY; 
    } 
    @Override 
    public void onDestroy() { 
     isRunning = false; 
    } 
} 

は、私は私のサービスを開始し、それにバインドする方法です:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     startService(new Intent(this, TrackerService.class)); 
     bindService(new Intent(MainActivity.this, TrackerService.class), myConnection, Context.BIND_AUTO_CREATE); 
    } 
+0

の可能性のある重複した[Looper.prepare(呼び出されていないスレッド内でハンドラを作成することはできません)](http://stackoverflow.com/questions/3875184/cant-create-handler-:このようなスレッドスレッド内のスレッドにはルーパーと呼ばれていない) – Destrif

答えて

1

あなたがメインUI上で実行するコードを追加することができます

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      //your code here 
      } 
    }); 
+0

どこで使うべきですか?サービスまたはサービスを開始しているアクティビティで –

関連する問題