2016-08-17 40 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)来检查。 没有进度条出现,调试显示: 跳过180帧!该应用程序可能在IT​​S主线程上做了太多工作。

这怎么解决?

我会有很多异步调用,我总是会显示一个进度条来等待响应完成。

谢谢

+0

您不应该在UI线程上调用'Thread.sleep()'。 – EpicPandaForce

+0

mmmm .... oki ...但: 从那时起我模拟请求需要几秒钟?为确保显示进度条? 此外,我认为使用Retrofit 2进行调用以使Async,AsyncTask。 – daicon

+1

我认为问题出在你的showProgress实现上,或者那个调用执行的很快,而且你无法看到进度条,因为它是立即显示/隐藏的。如果添加延迟而不是睡眠(处理程序帖子),您将看到一个进度条。 – Beloo

回答

0

让我与大家分享了由Android Studio和我的改造实现创建的默认登录活动矿代码实现。默认登录活动,包括AsyncTask,其中调用UserLoginTask,在里面,我做了我所有的登录逻辑的东西。我使用.execute代替.enqueue因为它同步,我们并不需要新的线程内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

感谢您的代码。 在我的一个测试中,我做了。 但我有一个问题: 什么可以是我们想要使用Rynctrit 2 Sync与AsyncTask的原因,可以使用Retrofit 2 Async? 谢谢 – daicon

+0

@daicon当然可以,但在您的问题中,我没有看到您的所有活动代码。我不明白你写的睡眠。 一般来说,你的问题对我来说不是很清楚,你是否有改装或用户界面出现异常的问题,或只看到警告“ITS主线程工作太多”? – neustart47

0

无耻促进

我为创建RxLoading library,就可以做到这一点,多少更多的,

你可以做这样的事情:

networkCall().compose(RxLoading.<>create(loadingLayout)).subscribe(...); 

它由2个类组成,一个自定义视图(loadingLayout)和一个将它们粘在一起的transformer的RxLoading,您可以选择使用它们中的任何一个或两个。

虽然你需要使用retrofit2和RxJava。

RxLoading还支持空和错误状态(带内置重试机制,所以一定要检查这个选项,以及)

你可以找到更多的GitHub page