我试图通过使用接口来获得asynctask的结果,但是当我尝试使用该接口上的方法时,我的应用程序不断崩溃。获取AsyncTask的结果
该项目有4个java文件:MainActivity.java,SigninActivity.java,GetAvailableExam.java,AsyncResponse.java
我敢肯定,错误不在GetAvailableExam.java,因为它只是一个打印hello world的活动,所以我不打算在这里发布它的代码,我也将修剪整个代码,只发布我认为与此问题相关的代码。
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(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));
}
}
整个问题的关键是,如果结果令人满意打开活动,但上面的代码,如果我尝试它添加如果条件不工作。
如果有人有兴趣看到整个代码我已经张贴here
那么你没有发布崩溃,但我认为它是空指针异常,因为委托为空。你为什么要操纵另一个活动的公共成员变量?这几乎肯定是设计不好的一个标志。而且由于它是一个非静态成员,你甚至在mainactivity上如何获得signinactivity的有效副本? –
那么我在这里看到它作为一个公认的答案,因此我认为它会在我身上。 –
使用类似这样的界面是可以接受的做事方式(参见Rajen下面的示例,了解正确的做法)。在第二个活动中使用变量不是。它封装失败,并会使你的代码难以维护。为什么你会想要把这两项活动结合在一起? –