У меня проблема, я пытаюсь получить доступ к частной переменной внешнего класса из метода 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 в любом случае, похоже, что строка кода никогда не выполняется и переменная не доступна, поэтому это всегда ложно.
Возможно, у вас есть исключение перед этой линией? – Vigen
внутри функции отправки после выполнения вы проверяете значение sentResult. Я думаю, что это всегда ложь, потому что AsyncTask - это отдельный поток. проверьте это значение в onPostExecute – Vigen
@Vigen no exception – FF91