UI线程问题的竞争状况. [英] Race condition with UI thread issue.

查看:78
本文介绍了UI线程问题的竞争状况.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我正在处理的代码.在这里,我无法更新UI,直到my OnResponse完成.由于我们正在执行doInBackgrnd,因此我的textresponse为空.而且由于onPostExecute恰好在此之后发生.

This is the code i am working on. Here I cant update the UI until myOnResponse is finished.Because we are doing a doInBackgrnd, so my textresponse is empty. And Since onPostExecute is happening right after.

对于他来说,我认为PublicProgres应该有所帮助. 如何在AsyncTask上调用PublishProgress?

For his I think PublicProgres should help. How to Call PublishProgress at 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);
    }
}

请帮助.

推荐答案

我认为您不必使用AsyncTask.

您可以执行以下操作:

YourTask.java

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

SomeActivity.java

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

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

尽管如此,如果您想在Asynktask中执行此操作,请尝试

Nevertheless if you want to do this action in Asynktask just try this

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;
    }
}

希望有帮助

这篇关于UI线程问题的竞争状况.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆