2016-01-26 13 views
8

Usiłuję zbudować aplikację z offline sync i poszedł za tutorial on AzureAzure MobileServicePushFailedException na Androida

teraz offline storage działa dobrze, ale żadnych przedmiotów są dodawane do na serwerze z następującym wyjątkiem:

 Error syncAsync com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException 
java.util.concurrent.ExecutionException: com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException 
    at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299) 
    at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286) 
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) 
    at irisrecognition.example.com.irisrecognition.util.ItemManager$5.doInBackground(ItemManager.java:237) 
    at irisrecognition.example.com.irisrecognition.util.ItemManager$5.doInBackground(ItemManager.java:232) 
    at android.os.AsyncTask$2.call(AsyncTask.java:288) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: com.microsoft.windowsazure.mobileservices.table.sync.push.MobileServicePushFailedException 
    at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.pushOperations(MobileServiceSyncContext.java:939) 
    at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.consumePushSR(MobileServiceSyncContext.java:834) 
    at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext.access$1100(MobileServiceSyncContext.java:85) 
    at com.microsoft.windowsazure.mobileservices.table.sync.MobileServiceSyncContext$PushSyncRequestConsumer.run(MobileServiceSyncContext.java:1127) 

Oto kod dla onCreate()

try { 
     mClient = new MobileServiceClient(
       Constants.ROOT_URL, 
       "kfogvaexzeDLYyPbRmBiHxQEBUYpku30", 
       this).withFilter(new ProgressFilter()); 

     initLocalStore().get(); 
     syncAsync(); 
     refreshItemsFromTable(); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

i niektórych innych ...

private AsyncTask<Void, Void, Void> initLocalStore() throws MobileServiceLocalStoreException, ExecutionException, InterruptedException { 

     AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        mPullQuery = mClient.getTable(IrisEntry.class).where().orderBy("__createdAt", QueryOrder.Descending); 

        MobileServiceSyncContext syncContext = mClient.getSyncContext(); 
        SQLiteLocalStore localStore = new SQLiteLocalStore(mClient.getContext(), "OfflineStore", null, 1); 
        SimpleSyncHandler handler = new SimpleSyncHandler(); 

        Map<String, ColumnDataType> tableDefinition = new HashMap<String, ColumnDataType>(); 
        tableDefinition.put("id", ColumnDataType.String); 
        tableDefinition.put("text", ColumnDataType.String); 
        tableDefinition.put("device", ColumnDataType.String); 
        tableDefinition.put("segmentationAlgo", ColumnDataType.String); 
        tableDefinition.put("imageUri", ColumnDataType.String); 
        tableDefinition.put("containerName", ColumnDataType.String); 
        tableDefinition.put("resourceName", ColumnDataType.String); 
        tableDefinition.put("sasQueryString", ColumnDataType.String); 
        tableDefinition.put("userId", ColumnDataType.String); 
        tableDefinition.put("complete", ColumnDataType.Boolean); 

        localStore.defineTable(Constants.TABLE_IRIS, tableDefinition); 
        syncContext.initialize(localStore, handler).get(); 

        mIrisTable = mClient.getSyncTable(IrisEntry.class); 
       } catch (final Exception e) { 
        e.printStackTrace(); 
       } 

       return null; 
      } 
     }; 

     return runAsyncTask(task); 
    } 


public void syncAsync() { 
     if (isNetworkAvailable()) { 
      new AsyncTask<Void, Void, Void>() { 

       @Override 
       protected Void doInBackground(Void... params) { 
        try { 
         mClient.getSyncContext().push().get(); 
         mIrisTable.pull(mPullQuery).get(); 
         Log.e(LOGTAG, "Success syncAsync"); 

        } catch (Exception e) { 
         Log.e(LOGTAG, "Error syncAsync " + e.getMessage()); 
         e.printStackTrace(); 

        } 
        return null; 
       } 
      }.execute(); 
     } else { 
      Log.e(LOGTAG, "You are not online, re-sync later!"); 
     } 
    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 

Uprawnienia do mojego stołu są ustawione na zezwalanie na Application Key. Jakieś pomysły?

EDIT:

ten pojawia się w pliku dziennika na serwerze:

ERROR 
{ [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' } 
+0

Opublikuj ślad stosu. – BanditoBunny

+0

Spróbuj przeprowadzić debugowanie za pomocą Fiddlera, aby zobaczyć, jakie połączenia są wysyłane na serwer. Jakie są szczegóły wyjątku Push Failed? –

+0

Edytowanie pytania, aby wstawić teraz cały wyjątek. Nie mam pojęcia, co Fiddler będzie musiał sprawdzić – 4ndro1d

Odpowiedz

0

Nie jestem pewien, czy jest to odpowiedź, ale robi „Constants.ROOT_URL” to ciąg protokół nagłówka jak " http://myurl.com "? Błąd ENOTFOUND oznacza, że ​​adres wywołania getaddrinfo nie mógł zostać rozwiązany. Możesz spróbować "myurl.com", bez części protokołu URI. Również metoda wymaga typu klasy Uri dla argumentu. Wygląda na to, że możesz pobrać ślad stosu z obsługi wyjątków MalformedURIE. (Połączenie prawdopodobnie używa https, nawet jeśli podałeś coś innego).

0

O ile się domyśliłem, problem polega na tym, że moje tabele są ustawione na Anonmyous Access. Ustawiłem je na Authenticated Only, a synchronizacja znowu działała. W każdym razie chcę, aby niektóre tabele były dostępne bez uwierzytelnienia (przeczytane przez wszystkich użytkowników) i sprawdzą, czy mogę to naprawić, w jakiś sposób.