0

バックグラウンド サービスを使用して特定の時間間隔で位置座標を取得し、データベースの更新操作を実行しています。私はすでに多くの同様の問題を検索しましたが、助けにはなりませんでした。

この操作を実行するために、サービス内にスレッドを作成しました。しかし、サービスが場所を更新していないときに立ち往生しています。メソッド「requestLocationUpdates()」がスレッド内で呼び出されていないことがわかりました。実際、スレッド内で Toast メソッドを使用しましたが、これも機能しませんでした。

問題は、上記の両方のメソッドに渡される「コンテキスト」引数にある可能性があります。しかし、私はこのコードを修正できません。

主な関心事は、サービス中のスレッドから正確な位置を取得し、それらをサーバーに更新することです。この部分を説明するために、正しいコードまたは同じ機能をより良い方法で示す他のソースを教えてください。これが私のコードです...

public class IcareService extends Service implements LocationListener
{   

 private Handler mUserLocationHandler = null;
 Thread triggerService; 
 LocationManager lm;
 Criteria criteria;
 String provider,lat,lon,rid;



    @Override
 public void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
 Toast.makeText(this, "Stopping  Service and so thread...", Toast.LENGTH_SHORT).show();
 mUserLocationHandler.getLooper().quit();
 }


  @Override
  public IBinder onBind(Intent intent) 
    {
     //Not implemented...this sample is only for starting and stopping services.
     //Service binding will be covered in another tutorial
     return null;
    }


    @Override
    public void onCreate() 
    {
            super.onCreate();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
      super.onStartCommand(intent, flags, startId);
      //Announcement about starting
      Toast.makeText(this, "Starting Service...", Toast.LENGTH_SHORT).show();
      addLocationListener();            
      return START_STICKY;
    }




    private void addLocationListener()
    {
        triggerService = new Thread(new Runnable(){
        public void run(){
         try{
              Looper.prepare();//Initialise the current thread as a looper.

              mUserLocationHandler = new Handler();

              lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

             // Creating a criteria object to retrieve provider
             Criteria c = new Criteria();
             criteria.setAccuracy(Criteria.ACCURACY_COARSE); 

            // Getting the name of the best provider
            final String PROVIDER = lm.getBestProvider(c, true);

        //This 2 below statement not executing...       
          lm.requestLocationUpdates(PROVIDER, 7000, 5, IcareService.this);
      Toast.makeText(IcareService.this, "Updating Location...", Toast.LENGTH_SHORT).show();


            Thread.sleep(7000);                    
            Looper.loop();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }, "LocationThreadicare");
        triggerService.start();
    }


@Override
    public void onLocationChanged(Location location) {
// Getting latitude of the current location
double latitude = location.getLatitude();
lat = Double.toString(latitude);

 // Getting longitude of the current location
 double longitude = location.getLongitude();
 lon= Double.toString(longitude);
 Toast.makeText(this, "Gt loc nw sendng to srvr", Toast.LENGTH_SHORT).show();

     SendtoServer();            

}


      @Override
      public void onProviderDisabled(String provider) {
  // TODO Auto-generated method stub

      }


    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    } 


    SendtoServer(){
    .............}
}
4

1 に答える 1

0

Toast をデバッグに使用しないでください (ちなみに、メイン スレッドとも呼ばれる UI スレッドで実行する必要があります)。

Log.d("--------","\n\n-------"+Thread.currentThread().getName()+"\n\n");

このようなロギングをonCreate()/onDestroy() および関心のある場所に追加すると、何が起こるかがわかります。

adb logcatログを表示するために使用します。

于 2013-04-02T05:53:29.133 に答える