Состояние гонки с проблемой потока пользовательского интерфейса.

Это код, над которым я работаю. Здесь я не могу обновить пользовательский интерфейс, пока мой 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);
    }
}

Пожалуйста помоги.


person Daisy_s    schedule 02.12.2016    source источник
comment
ваш вопрос не ясен. С какой проблемой вы столкнулись? Вы хотите показать что-то пользователю во время обработки фоновой службы?   -  person nandsito    schedule 02.12.2016


Ответы (1)


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

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

Ваша задача.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;
    }
}

Надеюсь, поможет

person Mody    schedule 02.12.2016
comment
Не могли бы вы помочь мне, куда поместить мой action5(textResponse) // другое действие, которое я планирую выполнить из Conversationtask// - person Daisy_s; 02.12.2016
comment
вы гарантируете, что методы setText(), вызываемые внутри onResponse(), выполняются в основном потоке? - person nandsito; 02.12.2016