【问题标题】:if the status is success then also else block executing in android如果状态为成功,则还阻止在 android 中执行
【发布时间】:2019-06-11 12:23:29
【问题描述】:

在下面的代码中,当用户输入他们的电子邮件 ID 和密码然后单击登录按钮时,我会显示带有消息身份验证的进度对话框,然后它进入 loginActivity.java(相同的活动本身)。

现在,再次打开同一个应用程序,然后它显示另一个活动。

但是,我的问题是登录是否成功。如果成功就是失败意味着为什么要转移到下一个活动。

在下面的代码中描述了从启动屏幕假设用户登录已经完成然后它将显示主屏幕,否则它将再次显示登录页面。

如果 emailId 和密码作为参数传递,那么也只执行 else 块消息,例如“服务器没有响应”

准时登录校验码:

private void handlerMethod() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                /* Create an Intent that will start the Menu-Activity. */
               // User_SharedPreference sharedPreference = new User_SharedPreference();
               // boolean isLoggedIn = sharedPreference.isLoggedIn(context);
                SharedPreferences app_preferences = PreferenceManager
                        .getDefaultSharedPreferences(SplashActivity.this);

                SharedPreferences.Editor editor = app_preferences.edit();
                isFirstTime = app_preferences.getBoolean("isFirstTime", true);

                if (isFirstTime) {

                    Intent mainIntent;
                    mainIntent = new Intent(SplashActivity.this, LoginActivity.class);
                    startActivity(mainIntent);
                    finish();

                }else{

                    Intent mainIntent;
                    mainIntent = new Intent(SplashActivity.this, DeviceControlActivity.class);
                    startActivity(mainIntent);
                    finish();

                }

            }
        }, TIME_OUT);
    }

当用户点击登录按钮时正在调用该方法

login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                getlogindetails();

            }
        });
    }

在下面的界面中,我将方法作为帖子提及并传递两个字符串。 API1.java:

@FormUrlEncoded
    @POST("/app_login")
    Call<Login> authenticate(@Field("emailId") String emailId, @Field("password") String password);

在课程中描述了来自我正在检查状态的服务器的后续响应

Login.java:(POJO)

public class Login {

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @SerializedName("status")

    private String status;


}

在下面的函数或方法中,将发送电子邮件 ID 和密码作为参数描述。如果服务器的响应成功,那么我将进入下一个活动。

getlogindetails 函数:

private void getlogindetails() {
 String url = "http://172.24.1.1:9000";

        Retrofit retrofit = null;
        Log.d("123", "retrofit");

        if (retrofit == null) {
            retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).build();
            Log.d("123", "build();");
        }
        final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this);
        progressDialog.setIndeterminate(true);
        progressDialog.setMessage("Authenticating..." + 60000 / 1000 + " Second(s)");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setCancelable(false);
        progressDialog.setIndeterminate(true);

        new CountDownTimer(60000, 1000) {

            public void onTick(long millisUntilFinished) {
                // You don't need anything here
                progressDialog.setMessage("Authenticating...");
                if (!progressDialog.isShowing()) progressDialog.show();
            }
            public void onFinish() {
                if (progressDialog.isShowing())
                    progressDialog.dismiss();
            }
        }.start();

        API1 service = retrofit.create(API1.class);

        Call<Login> call = service.authenticate(emailId, password);
        Log.i(TAG, "Sending---" + url + service + url + "\n" + "emailId:" + emailId + "\n" + "password:" + password);

        call.enqueue(new Callback<Login>() {
            @Override
            public void onResponse(Call<Login> call, Response<Login> response) {
// String status=response.body().getStatus().toString();
                if (response !=null && response.isSuccessful()) {
                    String status = response.body().getStatus();
                   if (response !=null && response.isSuccessful()) {
                String status = response.body().getStatus();
                if(status=="success") {
                    progressDialog.dismiss();
                    SharedPreferences app_preferences = PreferenceManager
                            .getDefaultSharedPreferences(LoginActivity.this);
                    SharedPreferences.Editor editor = app_preferences.edit();
                    editor.putBoolean("isFirstTime", false);
                    editor.commit();
                    Toast.makeText(LoginActivity.this, "Login successfully", Toast.LENGTH_SHORT).show();
                    Intent mainIntent;
                    mainIntent = new Intent(LoginActivity.this, DeviceControlActivity.class);
                    startActivity(mainIntent);
                    finish();
                }
                else{
                    Toast.makeText(LoginActivity.this, "No Response from server", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(LoginActivity.this, "Invalid EmailId and password", Toast.LENGTH_SHORT).show();

            }
        }
            @Override
            public void onFailure(Call<Login> call, Throwable t) {
                Log.e(TAG, "Unable to submit post to API.");
                progressDialog.dismiss();

            }
        });
    }

【问题讨论】:

  • 你能详细解释一下你想要什么吗?
  • 如果登录成功想要移动到 DeviceControlActivity.class 。但是一旦关闭应用程序并再次打开它就不会继续显示 DeviceControlActivity.class
  • 请也分享日志
  • 没有日志............
  • 没有日志是什么意思?

标签: java android retrofit retrofit2


【解决方案1】:

好吧,当你第一次启动你的应用程序时,isFirstTime 是真的,所以下面的块被执行

if (isFirstTime) 
{   
   //implement your first time logic
   editor.putBoolean("isFirstTime", false);
   editor.commit();
   Intent mainIntent;
   mainIntent = new Intent(SplashActivity.this, LoginActivity.class);
   startActivity(mainIntent);
   finish();  
}

此块后isFirstTime 变为假

现在,在你的getlogindetails

@Override
public void onResponse(Call<Login> call, Response<Login> response) {
// String status=response.body().getStatus().toString();
   if (response !=null && response.isSuccessful()) {
         String status = response.body().getStatus();
             if(status=="success") {
                 progressDialog.dismiss();
                 Toast.makeText(LoginActivity.this, "Login successfully", Toast.LENGTH_SHORT).show();
                 Intent mainIntent;
                 mainIntent = new Intent(LoginActivity.this, DeviceControlActivity.class);
                 startActivity(mainIntent);
                 finish();
               }

这里没有处理status!="success"的情况。

所以,这里什么都没有发生,你仍然在 loginActivity 中。现在,当您再次启动您的应用程序时,由于 isFirstTime 为 false,您将被重定向到 DeviceControlActivity,因为您的代码中有以下代码块。

                else{
                Intent mainIntent;
                mainIntent = new Intent(SplashActivity.this, DeviceControlActivity.class);
                startActivity(mainIntent);
                finish();
               }

所以,基本上你需要做的是处理status!="success"时的情况,而且我建议你只有在得到status=="success"时才更改sharedPreference值

编辑:

if(status=="success") 添加一个 else 块,并在 Toast 中显示一些错误消息。

然后将下面的块放在 if(status=="success") 中,从你现在写的地方删除它。

editor.putBoolean("isFirstTime", false);
editor.commit();

希望这会有所帮助!

【讨论】:

  • 是的,它现在应该可以工作了,你测试了吗?顺便说一句,你不应该这样编辑你的问题,以后阅读你的问题的人不会明白。只是说..
  • 您现在遇到的错误是什么?你的代码在 git 上吗,我可以检查一下吗?
  • 如果您没有从服务器获得成功响应,您将无法登录,当您重新打开应用程序时,您应该仍然在登录屏幕上。
  • else{ Toast.makeText(LoginActivity.this, "服务器无响应", Toast.LENGTH_SHORT).show(); } 如果响应成功,则每次都执行此操作
  • 只有在服务器没有成功响应的情况下才会显示 Toast。请检查您的后端。如果它启动并运行,你可能想在 POSTMAN 或 ARC 上检查它
【解决方案2】:

检查状态值usign Log.e(); 代码仅在状态值为成功时有效,那么如果状态值不成功怎么办?

String status = response.body().getStatus();
if(status.equals("success")) 
{
    progressDialog.dismiss();
    Toast.makeText(LoginActivity.this, "Login successfully", Toast.LENGTH_SHORT).show();
    Intent mainIntent = new Intent(LoginActivity.this, DeviceControlActivity.class);
    startActivity(mainIntent);
    finish();
}

为此制作其他部分并给予适当的按摩..

希望你能明白

【讨论】:

    【解决方案3】:
      mainIntent = new Intent(LoginActivity.this, DeviceControlActivity.class);
    

    表明,它正在移动到 DeviceControlActivity.class 。签到那个班级。

    【讨论】:

      【解决方案4】:

      设置getApplicationContext() 而不是LoginActivity.this 并将finish() 放在mainIntent 之前。

      if(status=="success") {
           progressDialog.dismiss();
           Toast.makeText(LoginActivity.this, "Login successfully", Toast.LENGTH_SHORT).show();
           finish();
      
           Intent mainIntent = new Intent(getApplicationContext(), DeviceControlActivity.class);
           startActivity(mainIntent);
      
      }
      

      希望对你有所帮助。

      【讨论】:

      • 为什么要他用Application 更改Activity 上下文?
      • @AliAhsan 将 finish() 放在 mainIntent 之前,这样它是否会起作用
      • @AliAhsan 在这里查看答案stackoverflow.com/questions/22966601/…
      • 我知道以上两个之间有什么区别。为什么要他使用Application context
      • @jyocha finish() 只从堆栈中移除当前活动的实例
      猜你喜欢
      • 1970-01-01
      • 2022-12-05
      • 2020-06-06
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多