获取 AsyncTask 的结果

Getting The Result Of An AsyncTask

我试图通过使用接口获取异步任务的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。

这个项目有 4 个 java 文件:MainActivity.javaSigninActivity.javaGetAvailableExam.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。