获取 AsyncTask 的结果



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

这个项目有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);
}

您可能会认为"但它将始终为非空",但这取决于执行顺序。

总的来说,我认为会有一种更干净的方法来消除你正在使用的方法。

最新更新