2017-03-14 14 views
0

私はAndroid Appを開発しています。AzureでAppサービスを作成しました。&私は、 DBをMobileAppServicesを介して実行します。azure easy tableからデータを取得できず、Androidスタジオのリストにバインドすることができません。

テーブルに項目を追加できましたが(Easyテーブル)、テーブルからデータを取得できませんでした。

私は2通りの方法で試してみた:

はAsyncTaskなし/を使用してデータを取得します。

(1)エラーが発生します。

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(AsyncTaskを使用):致命的な例外:メイン プロセス:com.himk.karam.h、PID:3500 java.lang.IllegalStateException:方法を実行できませんでしたが アンドロイド:onClick 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)アンドロイド.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(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) )に起因com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) で:アンドロイドでjava.lang.reflect.Method.invoke(ネイティブメソッド) 時にjava.lang.reflect.InvocationTargetException .view。 View $ DeclaredOnClickListener.onClick(View.java:4720) android.view.View.performClick(View.java:5637) (android.view.View)$ PerformClick.run(View.java:22429) はandroidで表示します。 os.Handler.handleCallback(Handler.java:751) (andler.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) android.appにあります。 COMでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) でjava.lang.reflect.Method.invoke(ネイティブメソッド)でActivityThread.main(ActivityThread.java:6119) .android.internal.os.ZygoteInit。 main(ZygoteInit.java:776) 原因:java.lang.IllegalStateException:タスクを実行できません: タスクはすでに実行されています。 (andync.os.AsyncTask.executeOnExecutor(AsyncTask.java:609) at com.himk.karam.h.Login.runAsyncTask(Login.java:183) at com.himk.karam.h.Login.onClickVerify Login.java:114) at java.lang.reflect.Method.invoke(ネイティブメソッド) android.view.View $ DeclaredOnClickListener.onClick(View.java:4720) at android.view.View.performClick(View .java:5637) android.view.View $ PerformClick.run(View。(Looper.java:4542)の (Handler.java:751) とandroid.os.Handler.dispatchMessage(Handler.java:95) とandroid.os.Looper.loop(Looper.java: 15435) android.app.ActivityThread.main(ActivityThread.java:6119) (java.lang.reflect.Method.invoke)(ネイティブメソッド) 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(); 
    } 
} 

注:私はやりたいが、私はそれを表示したくないアンドロイドのリストにデータを持つことですユーザー。

+0

'原因:java.lang.IllegalStateException:タスクは実行できません:タスクは既に実行中です.'例外については、** AsyncTask **を複数回実行することはできません。詳細については、[この類似の問題](http://stackoverflow.com/questions/6879584/how-to-run-the-same-asynctask-more-than-once)を参照してください。 –

答えて

0

Aaron Chenが指摘したように、例外はAsyncTaskを複数回実行することに関する例外です。 AsyncTaskを使用して#1の実装では、タスクは2回実行されます。 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();で2回目です。あなたが最初のものからexecute()を削除した場合、うまくいくはずです。

#2実装では、onCreate()メソッドのUIスレッドで非同期クエリを実行しているため、アクティビティが読み込まれません。バックグラウンドスレッドで実行すると、この問題は解消されます。モバイルアプリケーションのバックエンドからデータをクエリする方法については、this紺碧のドキュメントをご覧ください。参考にすべきたくさんの例があります。

関連する問題