2015-08-08 149 views
-1

我有一個問題,我試圖從doInBackground方法AsyncTask這是內部類訪問一個外部類的私有變量。這裏有完整的代碼。從內部類訪問私有變量(AsyncTask)

public class MessageHandler { 
private Contact receiver; 
private String senderFacebookId; 
private String message; 
private final String TAG = "MessageHandler"; 
private Context context; 
boolean sentResult; 

public MessageHandler(Contact receiver, String senderFacebookId, String message, Context context) { 
    this.receiver = receiver; 
    this.senderFacebookId = senderFacebookId; 
    this.message = message; 
    this.context=context; 
    this.sentResult = false; 
} 

public void send(){ 
    Log.i(TAG, "Sending message to " + receiver.getName() + " receiver id: " + receiver.getFacebook_id() + " sender id: " + senderFacebookId + " message: " + message); 

    new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id()); 
    if(this.sentResult==true){ 
     Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG); 
     toast.show(); 

    }else{ 
     Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 



private class SenderAsync extends AsyncTask<String,String,String> { 

    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     HttpClient client = new DefaultHttpClient(); 

     try { 
      List<NameValuePair> parameter = new ArrayList<>(1); 
      parameter.add(new BasicNameValuePair("regId", "empty")); 
      parameter.add(new BasicNameValuePair("sender_id", params[0])); 
      parameter.add(new BasicNameValuePair("receiver_facebook_id", params[2])); 

      parameter.add(new BasicNameValuePair("message", params[1])); 

      String paramString = URLEncodedUtils.format(parameter, "utf-8"); 
      HttpGet get = new HttpGet(ProfileFragment.SERVER_URL_SEND_MESSAGE+"?"+paramString); 

      Log.i(TAG, paramString); 
      HttpResponse resp = client.execute(get); 
      System.out.println("SREVER RESPONSE " + resp.getStatusLine().getStatusCode()); 

      //THIS IS THE VARIABLE THAT I WANT TO ACCESS 
      if(resp.getStatusLine().getStatusCode()==200){ 
       MessageHandler.this.sentResult = true; 
      } 



     } catch (IOException e) { 

      Log.i(TAG,"Error :" + e.getMessage()); 
     } 
     return null; 
    } 
} 

}

,我試圖訪問的變量是布爾變量sentResult。我也打印出始終爲200的服務器的響應。即使我刪除了if條件,並且在任何情況下都將其設置爲true,但它看起來像是該行代碼永遠不會執行,並且該變量未被訪問,所以它總是假的。

+0

可能是你在該行之前有一個例外嗎? – Vigen

+0

內部發送函數執行後檢查sentResult的值。我認爲它總是錯誤的,因爲AsyncTask是一個單獨的線程。檢查onPostExecute中的值 – Vigen

+0

@Vigen沒有例外 – FF91

回答

2

異步任務的整個的一點是,它是異步的。如果你執行一項任務,你不會在下一行代碼中得到結果。爲了評估結果,您應該使用onPostExecute回調方法。

@Override 
protected void onPostExecute(String s) { 
    if(sentResult==true){ 
     Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG); 
     toast.show(); 
    }else{ 
     Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 

此外,如果您要更改您的方法簽名,您甚至不需要外部變量。

private class SenderAsync extends AsyncTask<String,String,Boolean> { 

@Override 
protected void onPostExecute(Boolean sent) { 
    if(sent == true){ 
     Toast toast = Toast.makeText(this.context, "Message Sent", Toast.LENGTH_LONG); 
     toast.show(); 
    }else{ 
     Toast toast = Toast.makeText(this.context, "ERROR: Message not Sent", Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 

@Override 
protected Boolean doInBackground(String... params) { 
    try { 
     ... 
     if (resp.getStatusLine().getStatusCode() == 200) { 
      return true; 
     } 
    } 
    catch (IOException e) { 

    } 

    return false; 
} 
0

爲SenderAsync創建構造函數;

公共SenderAsync(上下文的背景下,字符串senderId,絃樂味精,聯繫人接收器)

這樣調用它;

新SenderAsync(senderFacebookId,message,receiver.getFacebook_id())。execute();

而你需要在onPostExecute中得到你的結果。 無效onPostExecute(字符串returnedValue) {// 運行你想在這裏 if語句}

+0

爲什麼這應該解決我與sentResult變量的問題? – FF91

+0

我編輯了答案。在onPostExecute中調用sentResult變量。 – Want2bExpert

0

您嘗試驗證sentResult你告訴的AsyncTask完成其工作之後。 AsyncTask在單獨的線程上並行執行它必須做的事情。因此,直到完成,sentResult保持不變。

我的建議是把你的吐司邏輯放在onPostExecute中。

0

您正在使用AsyncTask不正確。 AsyncTask應該返回結果onPostExecute()和你的用戶界面應該有一個單獨的方法onPostExecute()調用(因此是異步名稱)。對於你正在努力完成的任務,你應該這樣做:

public void send() { 
    new SenderAsync().execute(senderFacebookId,message, receiver.getFacebook_id()); 
} 

public void processResult(boolean result) { 
    String resultMsg = result ? "Message Sent" : "ERROR: Message not Sent"; 
    Toast.makeText(this.context, resultMsg, Toast.LENGTH_LONG).show(); 
} 

private class SenderAsync extends AsyncTask<String, String, Boolean> { 
    ... 
    @Override 
    protected String doInBackground(String... params) { 
     ... 
     try { 
     ... 
     return (resp.getStatusLine().getStatusCode() == 200) 
     } 
     ... 
     return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     processResult(result); 
    } 
}