获得AsyncTask的结果

时间:2015-01-01 05:25:25

标签: android

我试图通过使用界面来获取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

3 个答案:

答案 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;,但这取决于执行顺序。

总的来说,我认为会有一种更清洁的方式来消除您正在使用的方法。