2015-01-01 57 views
-2

我試圖通過使用接口來獲得asynctask的結果,但是當我嘗試使用該接口上的方法時,我的應用程序不斷崩潰。獲取AsyncTask的結果

該項目有4個java文件:MainActivity.javaSigninActivity.javaGetAvailableExam.javaAsyncResponse.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

+0

那麼你沒有發佈崩潰,但我認爲它是空指針異常,因爲委託爲空。你爲什麼要操縱另一個活動的公共成員變量?這幾乎肯定是設計不好的一個標誌。而且由於它是一個非靜態成員,你甚至在mainactivity上如何獲得signinactivity的有效副本? –

+0

那麼我在這裏看到它作爲一個公認的答案,因此我認爲它會在我身上。 –

+0

使用類似這樣的界面是可以接受的做事方式(參見Rajen下面的示例,瞭解正確的做法)。在第二個活動中使用變量不是。它封裝失敗,並會使你的代碼難以維護。爲什麼你會想要把這兩項活動結合在一起? –

回答

4

嘗試這種方式

if(result.equals("student")) { 

用於string comparison

+0

嗯,這首先工作,但我需要解釋爲什麼.equals和==工作不同lol –

+0

@ClonedAccnt因爲'=='是一個'操作員',只能在'整數'值。因此... –

+1

哦,這就是爲什麼,我是一名PHP程序員,我們在數字和字符串上都使用==,但無論如何感謝您的幫助。 –

0

除了.equals()方法錯誤使用==作爲「MD」說,你代表的方式有點奇怪。

至少,檢查它不爲空:

if (delegate!=null) { 
    delegate.processFinish(result); 
} 

你可能會認爲「但它始終是非空」,但這是依賴於執行順序。

總體而言,我認爲會有一種更清晰的方式來消除您使用的方法。

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. 
     } 
    } 
} 

在這裏,在這種方法,你將永遠不會有你的界面委託null作爲要傳遞到您的AsycnOperation構造。