2015-08-08 164 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); 
    } 
}