我试图通过使用接口来获取异步任务的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。
这个项目有4个java文件:MainActivity.java,SigninActivity.java,GetAvailableExam.java,AsyncResponse.java
我很确定错误不在 GetAvailableExam 上.java因为它只是一个打印 hello world 的活动,所以我不会在这里发布它的代码,我也会修剪整个代码并只发布我认为与此问题相关的代码。
主活动.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usernameField = (EditText)findViewById(R.id.editText1);
passwordField = (EditText)findViewById(R.id.editText2);
status = (TextView)findViewById(R.id.textView6);
role = (TextView)findViewById(R.id.textView7);
method = (TextView)findViewById(R.id.textView9);
signinactivity.delegate = this;
}
public void processFinish(String output){
//Toast.makeText(getApplicationContext(), output, Toast.LENGTH_LONG).show();
}
登录活动.java
//global variables
private TextView statusField,roleField;
private Context context;
private int byGetOrPost = 0;
private String server_ip;
private ProgressDialog progress;
public AsyncResponse delegate=null;
protected void onPostExecute(String result){
this.statusField.setText("Login Successful");
this.roleField.setText(result);
this.progress.dismiss();
delegate.processFinish(result);
}
异步响应.java
public interface AsyncResponse {
void processFinish(String output);
}
SigninActivity.java上的delegate.processFinish(result)是导致崩溃的,如果我尝试删除/注释掉它,该应用程序可以正常工作。
此外,我只想问为什么这段代码不起作用?
protected void onPostExecute(String result){
this.statusField.setText("Login Successful");
this.roleField.setText(result);
this.progress.dismiss();
if(result=="student") {
context.startActivity(new Intent(context, GetAvailableExam.class));
}
}
整个问题的重点是在满足结果的情况下打开一个活动,但是如果我尝试在其上添加 if 条件,上面的代码将不起作用。
如果有人有兴趣查看整个代码,我已经在这里发布了它
试试这种方式
if(result.equals("student")) {
用于.equals()
string comparison
的方法
考虑您的上下文的示例示例。
public class AsyncOperation extends AsyncTask<String, Void, String>{
AsyncResponse delegate; //Here it is your interface instance
public AsyncOperation (AsyncResponse delegate){
this.delegate = delegate;
}
@Override
protected String doInBackground(String... params) {
String result;
// Do your processing here.
return result;
}
@Override
protected void onPostExecute(String result) {
if (result.equals("Student")){
// do your processing.
}
}
}
在此方法中,在传递给 AsycnOperation 构造函数时,接口委托永远不会为 null。
除了像"M D"所说的错误使用==
之外,你做委托的方式有点奇怪。
至少,检查它是否不为空:
if (delegate!=null) {
delegate.processFinish(result);
}
您可能会认为"但它将始终为非空",但这取决于执行顺序。
总的来说,我认为会有一种更干净的方法来消除你正在使用的方法。