2012-10-06 24 views
1

我正在開發使用MonoDroid Platform的android應用程序。該應用程序中有兩個模塊,一個是驅動模塊,另一個是乘客模塊。每當乘客預訂出租車時,他/她將能夠在地圖上查看出租車的位置。如果調用requestLocationUpdates來獲取用戶的新位置,應用程序崩潰

在驅動程序模塊中,我實現了兩個類,一個是GPSTracker類,另一個是NorthStarBackgroundService類(代碼如下)。

NorthStarBackgroundService上名爲UpdatePosition的方法負責更新乘客模塊獲取座標的數據庫中的駕駛員位置,並在地圖中顯示駕駛員位置。方法UpdatePosition從實現ILocationListener的GPSTracker類中獲取驅動程序的座標。如您在代碼中看到的,我已將RequestLocationUpdates註釋掉了。每當我運行應用程序而不註釋掉那行代碼時,我的應用程序崩潰。但是當我用註釋運行它時,它不會崩潰。我不知道這個問題。駕駛員移動時該位置也不會更新。

有人可能熟悉單聲道環境,請幫我解決這個問題。它已經5天,我正在努力解決這個問題,但我無法做到這一點。

我只使用網絡提供商來獲得粗略位置。如果這件作品完美無缺,我將擴展到Gps提供商。因爲計時器已被設置爲

代碼GPSTracker

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Locations; 
using Java.IO; 

namespace NorthStar.Driver 
{ 
    public class GPSTracker : Service, ILocationListener 

    { 

     public readonly Context mContext; 

     // flag for network status 
     Boolean isNetworkEnabled = false; 

     Location location; // location 
     public double latitude; // latitude 
     public double longitude; // longitude 

     public LocationManager locationManager; 



     public GPSTracker(Context context) 
     { 
      this.mContext = context; 
      getLocation(); 

     } 


     public Location getLocation() 
     { 
      locationManager = (LocationManager)mContext.GetSystemService(Context.LocationService); 

      // getting network status 
      isNetworkEnabled = locationManager.IsProviderEnabled(LocationManager.NetworkProvider); 

      if (isNetworkEnabled) 
      { 
       // locationManager.RequestLocationUpdates(LocationManager.NetworkProvider, 1000, 10, this); 

       if (locationManager != null) 
       { 
        location = locationManager.GetLastKnownLocation(LocationManager.NetworkProvider); 
        if (location != null) 
        { 
         latitude = location.Latitude; 
         longitude = location.Longitude; 
        } 
       } 
      } 

      return location; 
     } 


     /** 
     * Function to get latitude 
     * */ 
     public double getLatitude() 
     { 

      latitude = location.Latitude; 
      // return latitude 

      return latitude; 
     } 


     /** 
     * Function to get longitude 
     * */ 
     public double getLongitude() 
     { 
      latitude = location.Longitude; 
      // return latitude 

      return longitude;   
     } 

     public void OnLocationChanged(Location location) 
     { 
     } 


     public void OnProviderDisabled(String provider) 
     { 
     } 


     public void OnProviderEnabled(String provider) 
     { 
     } 


     public void OnStatusChanged(string provider, Availability status, Bundle extras) 
     { 
     } 


     public override IBinder OnBind(Intent arg0) 
     { 
      return null; 
     } 


    } 
} 

代碼NorthStarBrackgroundService

UpdatePosition被稱爲每20秒。 我已經創建了一個GPSTracker類的對象,並設置發送到數據庫的緯度和經度的值。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Preferences; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using NorthStar.Driver.Application; 
using TheNorthStar.Api.Requests; 
using TheNorthStar.Api.Results; 

namespace NorthStar.Driver 
{ 
    [Service] 
    public class NorthStarBackgroundService : Service 
    { 
     private string driverId; 
     private System.Timers.Timer timer; 

     public override IBinder OnBind(Intent intent) 
     { 
      return null; 
     } 

     public override void OnCreate() 
     { 
      base.OnCreate(); 
      timer = new System.Timers.Timer(20000); 
      timer.Elapsed += TimerElapsed;    
     } 

     void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      ThreadPool.QueueUserWorkItem(UpdatePosition); 
     } 

     public override void OnStart(Intent intent, int startId) 
     { 
      base.OnStart(intent, startId); 

      driverId = intent.GetStringExtra("driverId"); 

      timer.Start(); 
     } 

     public override void OnDestroy() 
     { 
      base.OnDestroy(); 
      timer.Stop(); 
     } 

     private void UpdatePosition(object data) 
     { 

      ConnectToSever api = new ConnectToSever(Helper.GetServer(ApplicationContext)); 

      GPSTracker gps = new GPSTracker(ApplicationContext); 

      var pos = new DriverPosition() { Latitude = gps.latitude, Longitude = gps.longitude, DriverId = driverId }; 
      try 
      { 
       api.UpdatePosition(pos); 
      } 
      catch 
      { 
       Android.Util.Log.Info("EXC_update1", "update driver failed"); 
      } 
     } 
    } 
} 

我不知道哪一點我出錯,使應用程序崩潰。 對此的任何提示都會很感激。

登錄貓輸出

I/EXC_logstart( 306): **************** starting driver module **************** 
I/ActivityManager( 60): Displayed activity MyDriver_Driver.MyDriver_Driver/northstar.driver.Activity1: 6632 ms (total 6632 ms) 
D/dalvikvm( 128): GC_EXPLICIT freed 201 objects/9848 bytes in 188ms 
D/dalvikvm( 120): GC_EXTERNAL_ALLOC freed 3163 objects/207880 bytes in 144ms 
D/dalvikvm( 120): GC_EXTERNAL_ALLOC freed 935 objects/60072 bytes in 172ms 
W/KeyCharacterMap( 306): No keyboard for id 0 
W/KeyCharacterMap( 306): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
I/ARMAssembler( 60): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x3bce60:0x3bcf1c] in 8041202 ns 
I/ActivityManager( 60): Starting activity: Intent { cmp=MyDriver_Driver.MyDriver_Driver/northstar.driver.MainActivity (has extras) } 
I/ActivityManager( 60): Displayed activity MyDriver_Driver.MyDriver_Driver/northstar.driver.MainActivity: 1216 ms (total 1216 ms) 
E/mono ( 306): 
E/mono ( 306): Unhandled Exception: Java.Lang.NullPointerException: Exception of type 'Java.Lang.NullPointerException' was thrown. 
E/mono ( 306): at Android.Runtime.JNIEnv.CallNonvirtualObjectMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00000] in <filename unknown>:0 
E/mono ( 306): at Android.Content.ContextWrapper.GetSystemService (System.String name) [0x00000] in <filename unknown>:0 
E/mono ( 306): at NorthStar.Driver.GPSTracker.getLocation() [0x00000] in <filename unknown>:0 
E/mono ( 306): at NorthStar.Driver.GPSTracker..ctor (Android.Content.Context context) [0x00000] in <filename unknown>:0 
E/mono ( 306): at NorthStar.Driver.MainActivity.RequestWork() [0x00000] in <filename unknown>:0 
E/mono ( 306): at NorthStar.Driver.MainActivity.<OnCreate>b__2 (System.Object x) [0x00000] in <filename unknown>:0 
E/mono ( 306): --- End of managed exception stack trace --- 
E/mono ( 306): java.lang.NullPointerException 
E/mono ( 306): at android.content.ContextWrapper.getSystemService(ContextWrapper.java:363) 
E/mono ( 306): at dalvik.system.NativeStart.run(Native Method) 
E/mono ( 306): 
D/Zygote ( 33): Process 306 exited cleanly (255) 
I/ActivityManager( 60): Process MyDriver_Driver.MyDriver_Driver (pid 306) has died. 
I/WindowManager( 60): WIN DEATH: Window{45103638 MyDriver_Driver.MyDriver_Driver/northstar.driver.Activity1 paused=false} 
I/WindowManager( 60): WIN DEATH: Window{4511aac0 MyDriver_Driver.MyDriver_Driver/northstar.driver.MainActivity paused=false} 
W/ActivityManager( 60): Scheduling restart of crashed service MyDriver_Driver.MyDriver_Driver/northstar.driver.NorthStarBackgroundService in 5000ms 
I/ActivityManager( 60): Start proc MyDriver_Driver.MyDriver_Driver for activity MyDriver_Driver.MyDriver_Driver/northstar.driver.Activity1: pid=320 uid=10042 gids={3003, 1015} 
I/UsageStats( 60): Unexpected resume of MyDriver_Driver.MyDriver_Driver while already resumed in MyDriver_Driver.MyDriver_Driver 
I/ActivityThread( 320): Publishing provider MyDriver_Driver.MyDriver_Driver.__mono_init__: mono.MonoRuntimeProvider 
D/dalvikvm( 320): Trying to load lib /data/data/MyDriver_Driver.MyDriver_Driver/lib/libmonodroid.so 0x44edf660 
D/dalvikvm( 320): Added shared lib /data/data/MyDriver_Driver.MyDriver_Driver/lib/libmonodroid.so 0x44edf660 
E/mono ( 320): WARNING: The runtime version supported by this application is unavailable. 
E/mono ( 320): Using default runtime: v2.0.50727 
I/monodroid-gc( 320): environment supports jni NewWeakGlobalRef 
W/monodroid-gc( 320): GREF GC Threshold: 1800 
I/EXC_logstart( 320): **************** starting driver module **************** 
W/InputManagerService( 60): Got RemoteException sending setActive(false) notification to pid 306 uid 10042 
I/ActivityManager( 60): Displayed activity MyDriver_Driver.MyDriver_Driver/northstar.driver.Activity1: 4214 ms (total 4214 ms) 
I/MonoDroid( 320): UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object 
I/MonoDroid( 320): at NorthStar.Driver.NorthStarBackgroundService.OnStart (Android.Content.Intent,int) <0x00038> 
I/MonoDroid( 320): at Android.App.Service.n_OnStart_Landroid_content_Intent_I (intptr,intptr,intptr,int) <0x00067> 
I/MonoDroid( 320): at (wrapper dynamic-method) object.0333e05f-221e-4109-91bd-6a13aa2251bd (intptr,intptr,intptr,int) <0x0003b> 
E/mono ( 320): 
E/mono ( 320): Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object 
E/mono ( 320): at NorthStar.Driver.NorthStarBackgroundService.OnStart (Android.Content.Intent intent, Int32 startId) [0x00000] in <filename unknown>:0 
E/mono ( 320): at Android.App.Service.n_OnStart_Landroid_content_Intent_I (IntPtr jnienv, IntPtr native__this, IntPtr native_intent, Int32 startId) [0x00000] in <filename unknown>:0 
E/mono ( 320): at (wrapper dynamic-method) object:0333e05f-221e-4109-91bd-6a13aa2251bd (intptr,intptr,intptr,int) 
D/Zygote ( 33): Process 320 exited cleanly (1) 
I/ActivityManager( 60): Process MyDriver_Driver.MyDriver_Driver (pid 320) has died. 
W/ActivityManager( 60): Scheduling restart of crashed service MyDriver_Driver.MyDriver_Driver/northstar.driver.NorthStarBackgroundService in 20000ms 
I/WindowManager( 60): WIN DEATH: Window{45127238 MyDriver_Driver.MyDriver_Driver/northstar.driver.Activity1 paused=false} 
I/UsageStats( 60): Unexpected resume of com.android.launcher while already resumed in MyDriver_Driver.MyDriver_Driver 
W/InputManagerService( 60): Got RemoteException sending setActive(false) notification to pid 320 uid 10042 
I/ActivityManager( 60): Start proc MyDriver_Driver.MyDriver_Driver for service MyDriver_Driver.MyDriver_Driver/northstar.driver.NorthStarBackgroundService: pid=327 uid=10042 gids={3003, 1015} 
I/ActivityThread( 327): Publishing provider MyDriver_Driver.MyDriver_Driver.__mono_init__: mono.MonoRuntimeProvider 
D/dalvikvm( 327): Trying to load lib /data/data/MyDriver_Driver.MyDriver_Driver/lib/libmonodroid.so 0x44edf580 
D/dalvikvm( 327): Added shared lib /data/data/MyDriver_Driver.MyDriver_Driver/lib/libmonodroid.so 0x44edf580 
E/mono ( 327): WARNING: The runtime version supported by this application is unavailable. 
E/mono ( 327): Using default runtime: v2.0.50727 
I/monodroid-gc( 327): environment supports jni NewWeakGlobalRef 
W/monodroid-gc( 327): GREF GC Threshold: 1800 
+0

請提供崩潰的日誌輸出:http://docs.xamarin.com/android/advanced_topics/android_debug_log –

+0

我附加了日誌cat輸出。 –

回答

1

我認爲你會以錯誤的方式去做。

這是怎麼回事,你是在每次想要某個位置時都實例化一個新的GPSTracker,然後嘗試檢索碰巧爲null的位置的屬性。

相反,我會實施ILocationListener直接在您的NorthStarBackgroundService

Greg Shackles對這樣一位聽衆here的例子應該是你所需要的。

具體來說,得到最後已知位置,並要求更新作爲例子:

_locationManager = (LocationManager)GetSystemService(LocationService); 
Location lastKnownLocation = _locationManager.GetLastKnownLocation(bestProvider); 

if (lastKnownLocation != null) ... // Set your instance variable for location. 

// You can set the thresholds that suit you here. 
_locationManager.RequestLocationUpdates(bestProvider, 5000, 2, this); 

然後實現:

public void OnLocationChanged(Location location) 
{ 
    // Update your instance variable for location 
} 

在這之後你可以有UpdatePosition()使用正在寫入的位置OnLocationChanged()

+0

謝謝SpriritMachine,你解決了我的問題。 –

+0

不客氣:) – manadart

0

從堆棧跟蹤它看起來像存在的OnStart()一個NullReferenceException。

我不熟悉的服務 - 但會不會是意圖是空 - 當然this reference說:

提供給startService(意向),給出的意圖。這可能是 如果服務在其進程已經離開 之後重新啓動並且之前已返回除 START_STICKY_COMPATIBILITY之外的任何內容,則返回null。

+0

但是,如果我沒有請求位置更新運行此應用程序它運行沒有崩潰。有人可以提供解決方案嗎? –

相關問題