我試圖通過使用接口來獲得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下面的示例,瞭解正確的做法)。在第二個活動中使用變量不是。它封裝失敗,並會使你的代碼難以維護。爲什麼你會想要把這兩項活動結合在一起? –