我试图通过使用界面来获取asynctask的结果但是当我尝试使用该界面上的方法时,我的应用程序一直在崩溃。
此项目有4个java文件: MainActivity.java , SigninActivity.java , GetAvailableExam.java , AsyncResponse.java < /强>
我很确定错误不在 GetAvailableExam.java 上,因为它只是一个打印hello world的活动所以我不会发布它&#39;这里的代码,我也将修剪整个代码并仅发布我认为与此问题相关的代码。
MainActivity.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();
}
SigninActivity.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);
}
AsyncResponse.java
public interface AsyncResponse {
void processFinish(String output);
}
SigninActivity.java 上的delegate.processFinish(结果)导致崩溃,如果我尝试删除/注释掉它,该应用程序正常工作。
此外,我只是想问为什么这段代码不起作用?
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条件,则上述代码不起作用。
如果有人有兴趣查看我已发布的整个代码here
答案 0 :(得分:4)
试试这种方式
if(result.equals("student")) {
.equals()
string comparison
方法
答案 1 :(得分:1)
考虑您的背景的示例。
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。
答案 2 :(得分:0)
除了错误地使用==
作为&#34; M D&#34;说,你做代表的方式有点奇怪。
至少,检查它是否为空:
if (delegate!=null) {
delegate.processFinish(result);
}
您可能会想到&#34;但它始终是非空的&#34;,但这取决于执行顺序。
总的来说,我认为会有一种更清洁的方式来消除您正在使用的方法。