UI 线程问题的竞争条件。
Race condition with UI thread issue.
这是我正在处理的代码。在这里我无法更新 UI 直到我的 OnResponse
是 finished.Because 我们正在做 doInBackgrnd
,所以我的 textresponse
是空的。因为 onPostExecute
紧随其后。
对于他,我认为 PublicProgres 应该有所帮助。
如何在AsyncTask调用PublishProgress?
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
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;
}
}
希望对您有所帮助
这是我正在处理的代码。在这里我无法更新 UI 直到我的 OnResponse
是 finished.Because 我们正在做 doInBackgrnd
,所以我的 textresponse
是空的。因为 onPostExecute
紧随其后。
对于他,我认为 PublicProgres 应该有所帮助。 如何在AsyncTask调用PublishProgress?
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
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;
}
}
希望对您有所帮助