2015-04-27 9 views
11

Cerco di utilizzare i servizi mobili di Azure dalla mia semplice app Form e non funziona. L'ultimo comando funziona per sempre. Ho controllato la connessione internet con un client Web ed è tutto a posto. Il codice funziona bene in una semplice applicazione per console Windows.Come utilizzare i servizi mobili di Azure da Xamarin.Forms?

var ms = new MobileServiceClient(
      @"https://xxx.azure-mobile.net/", 
      @"xxx" 
     ); 

    IMobileServiceTable<TodoItem> todoTable = 
     ms.GetTable<TodoItem>(); 
    List<TodoItem> items = todoTable 
     .Where(todoItem => todoItem.Complete == false).ToListAsync().Result; 

Edit: utilizzare Xamarin Studio perché ho solo licenza indie. Per il debug ho provato un Samsung Galaxy S3 e un Huawei Ascend P7, il risultato è stato lo stesso. Ho aggiornato Xamarin e ora produce un'interessante eccezione se uso async-attendi per ottenere il risultato.

Java.Lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at --- End of managed exception stack trace --- 
    at java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:675) 
    at at dalvik.system.NativeStart.main(Native Method) 
    at Caused by: java.lang.reflect.InvocationTargetException 
    at at java.lang.reflect.Method.invokeNative(Native Method) 
    at at java.lang.reflect.Method.invoke(Method.java:515) 
    at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:859) 
    at ... 2 more 
    at Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object 
    at at Xamarin.Forms.Platform.Android.FormsApplicationActivity.OnPrepareOptionsMenu (Android.Views.IMenu) <IL 0x00007, 0x00050> 
    at Android.App.Activity.n_OnPrepareOptionsMenu_Landroid_view_Menu_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d23da369/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.App.Activity.cs:4151 
    at at (wrapper dynamic-method) object.fcd55d8e-49be-4c8f-b3a6-37be6bdb988f (intptr,intptr,intptr) <IL 0x00017, 0x0005b> 
    at at md5530bd51e982e6e7b340b73e88efe666e.FormsApplicationActivity.n_onPrepareOptionsMenu(Native Method) 
    at at md5530bd51e982e6e7b340b73e88efe666e.FormsApplicationActivity.onPrepareOptionsMenu(FormsApplicationActivity.java:110) 
    at at android.app.Activity.onPreparePanel(Activity.java:2612) 
    at at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:518) 
    at at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:872) 
    at at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:243) 
    at at android.view.Choreographer$CallbackRecord.run(Choreographer.java:780) 
    at at android.view.Choreographer.doCallbacks(Choreographer.java:593) 
    at at android.view.Choreographer.doFrame(Choreographer.java:561) 
    at at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:766) 
    at at android.os.Handler.handleCallback(Handler.java:733) 
    at at android.os.Handler.dispatchMessage(Handler.java:95) 
    at at android.os.Looper.loop(Looper.java:136) 
    at at android.app.ActivityThread.main(ActivityThread.java:5290) 
    at ... 5 more 
+0

Forse lo provi con 'await'? Ho visto degli spigoli sia in TPL che in rete: il timing out non funzionava in particolare –

+0

. L'ho provato. Se provo a eseguire il debug del controllo, esci dalla funzione dopo la chiamata e non raggiungi mai il comando successivo. Ho provato con questo codice: \t \t \t Lista articoli = attendono todoTable \t \t \t \t .Dove (todoItem => todoItem.Complete == false) .ToListAsync(); –

+0

Sei sull'ultima versione di Xamarin - controlla due volte la più recente? Con quale dispositivo stai provando, solo un PC? Nessuna differenza tra debug e runtime? In tal caso stai usando Xamarin Studio o il plugin VS? –

risposta

6

Sei sicuro di non bloccare l'interfaccia utente con una combinazione di async/await (deadlock)? Modificare il codice come segue:

IMobileServiceTable<TodoItem> todoTable = await ms.GetTable<TodoItem>(); 
List<TodoItem> items = todoTable.Where(todoItem => todoItem.Complete == false).ToListAsync().ConfigureAwait(false); 

Vedi qui per maggiori informazioni su questo specifico problema: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Per maggiori informazioni su una situazione di stallo, Stefano Clary ha un ottimo blog su questo: http://blog.stephencleary.com/2012/02/async-and-await.html

Problemi correlati