【问题标题】:Return Volley Result to a different class将排球结果返回到不同的班级
【发布时间】:2019-10-04 01:05:40
【问题描述】:

如何将 StringRequest 或 JsonObjectRequest 的结果返回给我调用该方法的类。 在我的 MainActivty 中,我有一个登录按钮。当我按下它时,它会使用我的 Backgroundworker.class 中的 StingRequest 调用函数 checkLogin。如何将响应返回给我的 MainActivity 以对其进行处理或显示? 我不能在方法的末尾使用 return,因为它是异步的。我尝试在 MainActivity 中调用一个方法,但在到达 Intent 时总是出错

2019-05-16 16:43:52.794 3158-3158/com.test.Test E/Error: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

这样的登录功能的正确方法是什么?

-MainActivity

package com.test.Test;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.test.Test.tools.BackgroundWorker;

public class MainActivity extends AppCompatActivity {

    private EditText txtEditUser;
    private EditText txtEditPw;
    private Button btnLogin;
    private Button btnRegister;
    private TextView txtViewLoginfailed;
    private String user;
    private String password;

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

        txtEditUser = findViewById(R.id.txtEditUser);
        txtEditPw = findViewById(R.id.txtEditPw);
        btnLogin = findViewById(R.id.btnLogin);
        btnRegister = findViewById(R.id.btnRegister);
        txtViewLoginfailed = findViewById(R.id.txtViewLoginfailed);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user = txtEditUser.getText().toString();
                password = txtEditPw.getText().toString();
                new BackgroundWorker().checkLogin(user, password, getApplicationContext());
            }
        });
        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent register = new Intent(getApplicationContext(), Register.class);
                startActivity(register);
            }
        });
    }

    public void Login(Boolean LoginOK,Context context) {
        if (LoginOK) {
            Intent menu = new Intent(context, Menu.class);
            startActivity(menu);
        } else {
            txtViewLoginfailed.setText("Login failed");
        }
    }
}

-后台工作人员

public class BackgroundWorker {
    private Boolean LoginOK;

    public void checkLogin(final String user, final String password, final Context context) {

        String url = "http://192.168.0.2:80/webapp/login.php";
        RequestQueue queue = Volley.newRequestQueue(context);
        StringRequest sr = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            Log.d("testLogin", "3");
                            if (response.equals("login success")) {
                                LoginOK = true;
                                new MainActivity().Login(LoginOK, context);
                            } else {
                                Log.d("testLogin", "5");
                            }
                        } catch (Exception exc) {
                            exc.printStackTrace();
                            Log.e("Error", exc.getMessage());
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("Error", error.getMessage());
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();
                params.put("user_name", user);
                params.put("password", password);

                return params;
            }
        };
        queue.add(sr);
    }
}

【问题讨论】:

    标签: java android android-asynctask android-volley return-value


    【解决方案1】:

    你需要的是Callback接口。

    创建新界面,例如LoginRequestCallback:

    public interface LoginRequestCallback {
        void onLoginRequestSuccess();
        void onLoginRequestError(String errorMessage);
    }
    

    在您的checkLogin 方法中添加新参数LoginRequestCallback callback

        public void checkLogin(final String user, final String password, final Context context, LoginRequestCallback callback) { ... }
    

    然后调用登录成功或错误对应的方法:

    public void checkLogin(final String user, final String password, final Context context) {
    
            String url = "http://192.168.0.2:80/webapp/login.php";
            RequestQueue queue = Volley.newRequestQueue(context);
            StringRequest sr = new StringRequest(Request.Method.POST, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                Log.d("testLogin", "3");
                                if (response.equals("login success")) {                           
                                    callback.onLoginRequestSuccess();
                                } else {
                                    callback.onLoginRequestError("Invalid credentials");
                                }
                            } catch (Exception exc) {
                                exc.printStackTrace();
                                Log.e("Error", exc.getMessage());
                                callback.onLoginRequestError(exc.getMessage());
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("Error", error.getMessage());
                            callback.onLoginRequestError(exc.getMessage());
                        }
                    }
            ) {
                @Override
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("user_name", user);
                    params.put("password", password);
    
                    return params;
                }
            };
            queue.add(sr);
        }
    

    当从MainActivity调用时,使MainActivity类实现这个接口:

    public class MainActivity extends Activity implements LoginRequestCallback { 
    //... 
    
        @Override
        public void onLoginRequestSuccess() {
    
        }
    
        @Override
        public void onLoginRequestError(String errorMessage) {
    
        }
    
    }
    

    当您调用此方法时,将this 作为回调传递:

    void onLoginButtonClicked(View v) {
        String user = "Asd";
        String password = "asdasd";
        this.backgroundWorker.checkLogin(user, password, this, this);
    }
    
    @Override
    public void onLoginRequestSuccess() {
        this.Login(true, this);
    }
    
    @Override
    public void onLoginRequestError(String errorMessage) {
        Toast.makeText(this, errorMessage, Toast.SHORT).show();
    }
    

    【讨论】:

    • 感谢您的回答,您的最后一个代码块有两个问题。如何将“this”作为回调传递?我试过: new MainActivity().onLoginButtonClicked(this);对此的错误消息是:无法将 MainActivity 中的 onLoginButtonClicked (android.view.View) 应用于 (匿名 android.view.View.OnClickListener) 并且 onLoginButtonClicked 方法的最后一部分不起作用 this.BackgroundWorker.checkLogin(user ,密码,这个,这个);错误按摩:无法解析符号 'BackgroundWorker' 我可以改用:new BackgroundWorker().checkLogin(user, password, this, this);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2017-03-30
    • 1970-01-01
    • 2019-01-18
    • 2012-11-30
    相关资源
    最近更新 更多