获取 AsyncTask 的结果
Getting The Result Of An AsyncTask
我试图通过使用接口获取异步任务的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。
这个项目有 4 个 java 文件:MainActivity.java,SigninActivity.java,GetAvailableExam.java , AsyncResponse.java
我很确定错误不在 GetAvailableExam.java 上,因为它只是一个打印 hello world 的 activity,所以我不是转到 post 此处的代码,我还将 trim 整个代码和 post 仅我认为与此问题相关的代码。
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(结果)是导致崩溃的原因,如果我尝试 remove/comment 出来吧。
另外我想问一下为什么这段代码不起作用?
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));
}
}
整个问题的重点是如果结果满足就打开一个activity,但是如果我尝试在上面的代码上添加一个if条件,上面的代码就不起作用了。
如果有人有兴趣查看完整代码,我已经 post 编辑了它 here
试试这个方法
if(result.equals("student")) {
使用 .equals()
方法 string comparison
除了"M D"所说的错误使用==
之外,你做委托的方式有点奇怪。
至少,检查它不为空:
if (delegate!=null) {
delegate.processFinish(result);
}
您可能会认为 "but it will always be non null",但这取决于执行顺序。
总的来说,我认为会有一种更简洁的方法来删除您正在使用的方法。
考虑到您的上下文的示例。
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。
我试图通过使用接口获取异步任务的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。
这个项目有 4 个 java 文件:MainActivity.java,SigninActivity.java,GetAvailableExam.java , AsyncResponse.java
我很确定错误不在 GetAvailableExam.java 上,因为它只是一个打印 hello world 的 activity,所以我不是转到 post 此处的代码,我还将 trim 整个代码和 post 仅我认为与此问题相关的代码。
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(结果)是导致崩溃的原因,如果我尝试 remove/comment 出来吧。
另外我想问一下为什么这段代码不起作用?
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));
}
}
整个问题的重点是如果结果满足就打开一个activity,但是如果我尝试在上面的代码上添加一个if条件,上面的代码就不起作用了。
如果有人有兴趣查看完整代码,我已经 post 编辑了它 here
试试这个方法
if(result.equals("student")) {
使用 .equals()
方法 string comparison
除了"M D"所说的错误使用==
之外,你做委托的方式有点奇怪。
至少,检查它不为空:
if (delegate!=null) {
delegate.processFinish(result);
}
您可能会认为 "but it will always be non null",但这取决于执行顺序。
总的来说,我认为会有一种更简洁的方法来删除您正在使用的方法。
考虑到您的上下文的示例。
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。