【发布时间】: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