2017-03-14 47 views
0

我正在開發Android應用程序,並且在Azure中創建了應用程序服務&我一直在嘗試瞭解如何與DB通過MobileAppServices。無法從Azure簡易表中檢索數據並將其綁定到Android Studio中的列表

我成功地將項目添加到表格(簡單表格),但我無法從表格中檢索數據。

我試圖在兩個方面:

與/檢索數據沒有的AsyncTask。

(1)我得到一個錯誤。 (使用的AsyncTask)

public void onClickVerify(View view) { 

     if (mClient == null) 
      return; 

     AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        final List<Users> URS = GetItemsFromMobileServiceTable(); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Verified = "Account is not Verified"; 
          for (Users i : URS) { 
           if (i.getUN() == null) 
            break; 

           else if(i.getUN() == Username.toString()) { 
            Verified = "Account Verified"; 
           } 
          } 
         } 
        }); 
       } catch (final Exception e) {} 

       return null; 
      } 
     }.execute(); 

     runAsyncTask(task); 

    } 


    private List<Users> GetItemsFromMobileServiceTable() throws ExecutionException, InterruptedException, MobileServiceException { 
     return mUser.where().field("UN").eq(Username.toString()).execute().get(); 
    } 
           --------- beginning of crash 03-14 12:40:54.623 3500-3500/com.himk.karam.h 

E/AndroidRuntime:致命異常:主 工藝:com.himk.karam.h,PID:3500 java.lang.IllegalStateException:無法執行方法 android:onClick at android.view.View $ DeclaredOnClickListener.onClick(View.java:4725) at android.view.View.performClick(View.java:5637) at android.view.View $ PerformClick.run( View.java:22429) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886 ) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 由於:java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android 。視圖。在android.view.View $ PerformClick.run(View.java:22429) 處查看$ DeclaredOnClickListener.onClick(View.java:4720) at android.view.View.performClick(View.java:5637) 。 os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app。 ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) at com .android.internal.os.ZygoteInit。 main(ZygoteInit.java:776) 引起:java.lang.IllegalStateException:無法執行任務: 任務已在運行。 at com.img.karam.h.Login.onClickVerify(com.img.karam.h.Login.runAsyncTask(Login.java:183) (android.os.AsyncTask.executeOnExecutor(AsyncTask.java:609) Login.java:114) at android.view.View $ DeclaredOnClickListener.onClick(View.java:4720) at android.view.View.performClick(View())在java.lang.reflect.Method.invoke(Native Method) .java:5637) at android.view.View $ PerformClick.run(View。的java:22429) 在android.os.Handler.handleCallback(Handler.java:751) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java: 154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit的.java:886) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

(2)啓動時的活動是c ontains是檢索作用的活動不加載(不使用AsynTask)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    try { 
     mClient = new MobileServiceClient("https://khim.azurewebsites.net",this); 

     mClient.setAndroidHttpClientFactory(new OkHttpClientFactory() { 
      @Override 
      public OkHttpClient createOkHttpClient() { 
       OkHttpClient client = new OkHttpClient(); 
       client.setReadTimeout(20, TimeUnit.SECONDS); 
       client.setWriteTimeout(20, TimeUnit.SECONDS); 
       return client; 
      } 
     }); 

     List<Users> mUsers = mClient.getTable(Users.class).execute().get();//if I remove this line the activity will load normally  
     Username = (EditText) findViewById(R.id.etUN); 
    } catch (MalformedURLException | InterruptedException | ExecutionException | MobileServiceLocalStoreException e) { 
     e.printStackTrace(); 
    } 
} 

注:所有我想要做的是在列表中有android的數據我不想看這件事TO THE用戶。

+0

'由於:java.lang.IllegalStateException:無法執行任務:任務已在運行.'由於異常本身解釋,您不能多次執行** AsyncTask **。你可以在SO上查看[這個類似的問題](http://stackoverflow.com/questions/6879584/how-to-run-the-same-asynctask-more-than-once)瞭解更多信息。 –

回答

0

就像Aaron Chen指出的,例外是關於多次執行AsyncTask。在使用AsyncTask的#1實現中,任務被執行兩次。第一次在AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){@Override protected Void doInBackground(Void... params) { /*...*/ }.execute();,第二次在mUser.where().field("UN").eq(Username.toString()).execute().get();。如果你從第一個中刪除execute(),它應該可以正常工作。

在#2實現中,由於您在onCreate()方法中的UI線程上運行異步查詢,因此無法加載該活動。如果你在後臺線程上運行它,這個問題將會消失。您可以查看this關於如何從移動應用程序後端查詢數據的azure文檔。有很多應該有幫助的例子。

相關問題