2016-08-17 10 views
2

Androidで新しいプロジェクトを作成するときにデフォルトのログインアクティビティを作成しました。 デフォルトではログインに適して正しく表示されるprogressBarを作成します。これにより、AsyncTaskが実行されます。改訂履歴2 - 進行状況バーの非同期表示方法

これで、Retrofit 2を使用して非同期ログインを行いました。

.... 
    .... 
    showProgress(true); 
    call.enqueue(new Callback<User>() { 

     @Override 
     public void onResponse(Call<User> call, retrofit2.Response<User> response) { 

      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      User userdatos = response.body(); 

       if(userdatos != null){ 
        // redirect to Main Activity page 
        showProgress(false); 
        Intent i = new Intent(LoginActivity.this, MainActivity.class); 
        startActivity(i); 
       } 
       else{ 
        showProgress(false); 
        mPasswordView.setError(getString(R.string.error_incorrect_password)); 
        mPasswordView.requestFocus(); 
       } 
     } 
     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      call.cancel(); 
      showProgress(false); 
      Toast.makeText(LoginActivity.this, "Please check your network connection and internet permission", Toast.LENGTH_LONG).show(); 
     } 
    }); 

は、私がチェックするのThread.sleep(3000)を強制的に:私はボタンのログインをプッシュ

コンテンツの方法を開始しました。 進捗バーが表示されず、デバッグには次の情報が表示されます。 Skipped 180 frames!アプリケーションがITSのメインスレッドであまりにも多くの作業をしている可能性があります。

どうすれば解決できますか?

私は、レスポンスが完了するのを待つために常にプログレスバーを表示する非同期呼び出しが多数あります。

+0

UIスレッドでは 'Thread.sleep()'を呼び出さないでください。 – EpicPandaForce

+0

mmmm .... oki ...しかし: それから私は要求が数秒かかることをシミュレートしますか?プログレスバーが表示されるようにするには? さらに、Retrofit 2でAsyncを呼び出すと、AsyncTaskが欲しいと思っていました。 – daicon

+1

問題はあなたのshowProgress実装にあると思うし、その呼び出しが非常に速く実行され、すぐに表示されたり隠されたりしてプログレスバーを見ることができません。スリープ(ハンドラポスト)の代わりに遅延を追加すると、進行状況バーが表示されます。 – Beloo

答えて

0

は私はあなたとAndroidのメーカーと私のレトロフィット実装によって作成されたデフォルトのログイン活動のための鉱山のコードの実装を共有しましょうありがとうございます。デフォルトのログインアクティビティは、というUserLoginTaskとなっており、その中にはすべてのログインロジックがあります。それが同期して、我々は、私がそのためのRxLoading libraryを作成しましたAsyncTask

public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { 

     private final String mEmail; 
     private final String mPassword; 

     UserLoginTask(String email, String password) { 
      mEmail = email; 
      mPassword = password; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      Retrofit restAdapter = new Retrofit.Builder() 
        .baseUrl(Constants.ROOT_API_URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
      IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class); 
      Call<JsonElement> result = service.getToken(mEmail, mPassword, "password"); 
      try { 
       //using sync request and get response 
       JsonElement element = result.execute().body(); 
       if(element!=null) { 
        //do whatever you want with your response 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return false; 
      } 
      return true; 
     } 

     @Override 
     protected void onPostExecute(final Boolean success) { 
      mAuthTask = null; 
      showProgress(false); 

      if (success) { 
       if(clientType != 2){ 
        mPasswordView.setError(getString(R.string.error_incorrect_password)); 
        mPasswordView.requestFocus(); 
        clientType = 0; 
       } 
       else { 
        Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
        startActivityForResult(intent, 1); 
       } 
//    finish(); 
      } else { 
       mPasswordView.setError(getString(R.string.error_incorrect_password)); 
       mPasswordView.requestFocus(); 
      } 
     } 

     @Override 
     protected void onCancelled() { 
      mAuthTask = null; 
      showProgress(false); 
     } 

    } 
+0

ありがとうコードです。 私のテストの1つで、私はしました。 私は質問があります: なぜ私たちはAsyncTaskでRretrofit 2 Syncを使いたいのですが、Retrofit 2 Asyncを使うことができますか? ありがとうございました – daicon

+0

もちろん@daiconでも可能ですが、あなたの質問ではあなたのアクティビティコードがすべて表示されませんでした。私はあなたが眠っていることについても理解していません。 あなたの質問は私にとってはっきりしませんが、Retrofitの問題やUIの例外がありますか、「ITSの主なスレッドではあまりにも多くの作業をする」という警告が表示されますか? – neustart47

0

恥知らず推進

内部の新しいスレッドを必要としない、それがこれを行うと、多くのことができますので、私は.execute代わりの.enqueueを使用しています

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...); 
:もっと、

あなたはちょうどこのような何かを行うことができます3210

2つのクラス、カスタムビュー(loadingLayout)とRxLoading(transformer)で構成されています。両方を接着するか、どちらか一方または両方を選択できます。

あなたはRxJavaでretrofit2を使用する必要があります。

RxLoadingも(ビルトイン再試行メカニズムと、そうもこのオプションをチェックしてください)空とエラー状態をサポート

あなたはより多くのGitHub pageに見つけることができます。

関連する問題