【问题标题】:How to start an activity only if a condition is met仅在满足条件时如何开始活动
【发布时间】:2016-10-22 23:37:56
【问题描述】:

我是 Android 开发的初学者,我的应用要求用户在LoginActivity 中输入他们的电子邮件和密码才能登录。如果凭据正常,则应用程序应启动 WorkActivity

这是 PHP 脚本。为了测试,我只是将$email$password 设置为静态值,而不是从数据库中获取它们。

<?php 
$response = array ("success"=> 0, "responseMessage"=> "Incorrect email/password combination");

$email = "mwangicj";
$password = "asd";
if($_SERVER['REQUEST_METHOD']=='POST'){
	$request = json_decode(file_get_contents('php://input'));
	if(!strcmp($email,$request->email)&& !strcmp($password,$request->password)){
		$response['success'] = 1;
		$response['responseMessage'] = "Login successful ".$request->email;
	}
}
echo json_encode($response);
?>

我正在使用 Volley 库向 PHP 发送和接收数据。这是登录活动

package com.mwangicj.Lugayocontributor;

import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class LoginActivity extends AppCompatActivity {
    EditText loginEmail, loginPassword;
    TextView message;
    Button loginButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        loginEmail = (EditText) findViewById(R.id.loginEmail);
        loginPassword = (EditText) findViewById(R.id.loginPassword);
        loginButton = (Button) findViewById(R.id.loginButton);
        message = (TextView) findViewById(R.id.message);

        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (connected()){
                    message.setText("");
                    String email = loginEmail.getText().toString();
                    String password = loginPassword.getText().toString();

                    if  (!email.isEmpty() && !password.isEmpty()){ //Check if fields are filled in
                        logInUser();
                    }else{
                        Toast.makeText(getApplicationContext(), "Supply both email and password!",Toast.LENGTH_LONG).show();
                    }
                }else{
                    Toast.makeText(getApplicationContext(), "No internet", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }
    //executing user's login request
    private void logInUser() {
        
        postJsonRequest("http://10.0.2.2:1234/app/json.php");
    }
    //Starting work activity
    void goToWork(){
         Intent i = new Intent(getApplicationContext(), WorkActivity.class);
        startActivity(i);
        finish();
    }

    //preparing user's login details
    private void postJsonRequest(String url) {
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        JSONObject params = new JSONObject();
        try {
            params.put("email", loginEmail.getText().toString());
            params.put("password", loginPassword.getText().toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                Request.Method.POST, url, params, new Response.Listener<JSONObject>(){

            @Override
            public void onResponse(JSONObject response) {
                try {
                    String success = response.getString("success");
                    String responseMessage = response.getString("responseMessage");
                    if (success == "0"){
                        message.setText(responseMessage);
                    }else{
                        Toast.makeText(getApplicationContext(), responseMessage, Toast.LENGTH_LONG).show();
                        goToWork();

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                message.setText("Error: " + error.toString());

            }
        });
        queue.add(jsonObjectRequest);
    }

    //Checking internet connection
    boolean connected (){
        ConnectivityManager cManager = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
        NetworkInfo nInfo = cManager.getActiveNetworkInfo();

        if(nInfo!=null && nInfo.isConnected()){
            return true;
        }else{
            return false;
        }
    }
}

问题是无论电子邮件和密码组合是否正确,WorkActivity 都会启动。

我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试过在调试器中单步执行代码?

标签: php android android-volley


【解决方案1】:

问题是== 运算符在比较对象时检查引用是否相等。要测试两个字符串的值是否相等,您应该改用equals() 方法。

来自String.equals()documentation

public boolean equals(Object anObject)

将此字符串与指定对象进行比较。结果为真,如果 并且仅当参数不为 null 并且是一个 String 对象时 表示与此对象相同的字符序列。

更改以下内容:

if (success == "0"){
    message.setText(responseMessage);
}

到这里:

if ("0".equals(success)){
    message.setText(responseMessage);
}

success 声明为原始int,而不是String

int success = response.getInt("success");
String responseMessage = response.getString("responseMessage");
if (success == 0){
    message.setText(responseMessage);
}

查看this answer 上的String 相等性。

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2017-12-12
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多