2015-08-08 2 views
-1

У меня проблема, я пытаюсь получить доступ к частной переменной внешнего класса из метода doInBackgroundAsyncTask, который является внутренним классом. Здесь есть полный код.Доступ к частной переменной из внутреннего класса (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 no exception – 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 (контекст Context, String SenderId, String тзд, Contact приемник) публичный

Назовите это таким образом;

новый SenderAsync (senderFacebookId, message, receiver.getFacebook_id()). Execute();

И вам нужно получить свой результат в onPostExecute. недействительный onPostExecute (String returnedValue) { // Запуск, если заявление вы хотите здесь }

+0

почему это должно решить мою проблему с переменной sentResult? – FF91

+0

Я отредактировал ответ. Вызовите переменную sentResult в onPostExecute. – Want2bExpert

0

Вы пытаетесь проверить sentResult сразу после сказать AsyncTask делать свою работу. AsyncTask делает то, что он должен делать в отдельном потоке, параллельно. Таким образом, пока он не закончится, sentResult не изменится.

Что я предлагаю, это поставить логику Toast в onPostExecute.

0

Вы используете AsyncTask неправильно. AsyncTask должен возвращать результаты в onPostExecute(), и ваш пользовательский интерфейс должен иметь отдельный метод onPostExecute() звонки (следовательно, асинхронное имя). За то, что вы пытаетесь выполнить, вы должны сделать это следующим образом: