Вернуть Результат залпа в другой класс - PullRequest
0 голосов
/ 16 мая 2019

как я могу получить результат StringRequest или JsonObjectRequest обратно в класс, где я вызвал метод. В моем MainActivty у меня есть кнопка входа. Когда я нажимаю его, он вызывает функцию checkLogin с StingRequest из моего Backgroundworker.class. Как я могу получить ответ обратно в MainActivity для его обработки или отображения? Я не могу использовать возврат в конце метода, потому что это асинхронность. Я пытался вызвать метод в 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");
        }
    }
}

-Backgroundworker

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);
    }
}

1 Ответ

0 голосов
/ 16 мая 2019

Вам нужен 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();
}
...