2016-12-02 9 views
1

Это код, над которым я работаю. Здесь я не могу обновить пользовательский интерфейс до тех пор, пока не закончится мой OnResponse. Потому что мы делаем doInBackgrnd, поэтому мой textresponse пуст. И С onPostExecute происходит сразу после.Состояние гонки с проблемой потока пользовательского интерфейса.

Для него я думаю, что PublicProgres должен помочь. Как вызвать PublishProgress в AsyncTask?

private class ConversationTask extends AsyncTask<String, Void, String> { 
    String textResponse = new String(); 
    @Override 
    protected String doInBackground(String... params) { 
     System.out.println("in doInBackground"); 
     MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build(); 
     // async 
     GLS_service.message("xxxxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() { 
      @Override 
      public void onResponse(MessageResponse response) { 
       context = response.getContext(); 
       textResponse = response.getText().get(0); 
       action5(textResponse); 
       System.out.println(textResponse); 

      } 
      @Override 
      public void onFailure(Exception e) { 
      } 
     }); 
     return textResponse; 
    }@Override protected void onPostExecute(String result) { 
     reply.setText(textResponse); 
    } 
} 

Помогите.

+0

Вашего вопроса остается неясным. В чем проблема, с которой вы столкнулись? хотите ли вы показать что-то пользователю во время обработки фонового сервиса? – nandsito

ответ

2

Я не думаю, что вам нужно использовать AsyncTask.

Вы можете сделать что-то вроде этого:

YourTask.java

public class YourTask implements Runnable { 

    private Handler handler; 
    private TextView textView; 

    public YourTask(TextView textView){ 
      this.textView = textView; 
      handler = new Handler(); 
    } 

    @Override 
    public void run() { 
     MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build(); 

     GLS_service.message("xxxxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() { 

      @Override 
      public void onResponse(MessageResponse response) { 
       final String textResponse = response.getText().get(0); 
       handler.post(new Runnable() { 
          @Override 
          public void run() { 
            if(textView != null){ 
             textView.setText(textResponse); 
            } 
          } 
       }); 
      } 

      @Override 
      public void onFailure(Exception e) { 
      } 
     });  
    } 

} 

И теперь, как использовать его:

SomeActivity.java

... 
textView = (TextView) findViewById(R.id.textView); 
... 

Thread thread = new Thread(new YourTask(textView)); 
thread.start(); 
... 

Тем не менее, если вы хотите для этого действия в Asynktask просто попробуйте это

private class ConversationTask extends AsyncTask<String, Void, Void> { 

    private Handler handler; 

    public ConversationTask(){ 
      handler = new Handler(); 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     MessageRequest newMessage = new MessageRequest.Builder().inputText(params[0]).context(context).build(); 

     GLS_service.message("xxxxxxxxx", newMessage).enqueue(new ServiceCallback<MessageResponse>() { 
      @Override 
      public void onResponse(MessageResponse response) { 
       final String textResponse = response.getText().get(0); 
       handler.post(new Runnable() { 
         @Override 
         public void run() { 
           if(reply != null){ 
            reply.setText(textResponse); 
           } 
         } 
       });     
      } 
      @Override 
      public void onFailure(Exception e) { 
      } 
     }); 
     return null; 
    } 
} 

Надеется, что это помогает

+0

Можете ли вы помочь мне в том, где положить мое действие5 (textResponse) // другое действие, которое я планирую выполнить из Conversationtask // –

+0

, вы гарантируете, что методы 'setText()', вызываемые внутри 'onResponse()', выполняются в основная тема? – nandsito

+0

Спасибо, что он работает для меня. –