无法从AsyncTask返回值;使用接口和委托



我正在AsyncTask中进行HTTP连接。我将查询的字符串结果返回给调用代码。在那里,我正在设置EditText"的值;HTTPResult";返回的结果字符串。但是HTTPResult是空的。这意味着不会向调用代码返回任何内容。但是,我正在AsyncTask中获取结果字符串,并且可以在AsyncTask的protected void onPostExecute(字符串位图(方法中设置HTTPResult。然后我使用了接口和委托,但没有得到结果。

代码:

public class RegisterActivity extends AppCompatActivity implements AsyncResponse {
Button btn_Connect;
EditText busNumber;
EditText text;
EditText HTTPResult;
String myServer="http://swulj.atwebpages.com/hi.php";
String myResult, token;
HTTPConnection1 conn = new HTTPConnection1();
RegisterActivity obj = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
btn_Connect = (Button) findViewById(R.id.button_Connect);
busNumber = (EditText) findViewById(R.id.Bus_number);
text = (EditText) findViewById(R.id.text);
HTTPResult = (EditText) findViewById(R.id.HTTPResult);
btn_Connect.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// it was the 1st button
Toast.makeText(getApplicationContext(),"You download is resumed2",Toast.LENGTH_LONG).show();
conn.delegate =  obj;
conn.execute(myServer, (String) busNumber.getText().toString());
//sleep(50000);
HTTPResult.setText(myResult);
/*StringTokenizer st = new StringTokenizer(myResult);
token = st.nextToken("<br>");
text.setText(token);
while (st.hasMoreTokens()) {
token = st.nextToken("<br>");
busNumber.setText(token);
}*/
}
});
}
@Override
public void processFinish(String output){
//Here you will receive the result fired from async class
//of onPostExecute(result) method.
myResult = output;
}


class HTTPConnection1 extends AsyncTask<String, Void, String> {
String result;
String url;
String busNumber;
public AsyncResponse delegate = null;

@Override
protected String doInBackground(String... params) {
url = params[0];
busNumber = params[1];
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", busNumber));
nameValuePairs.add(new BasicNameValuePair("message", "msg"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse httpResponse = httpclient.execute(httppost);
InputStream inputStream = httpResponse.getEntity().getContent();
//HTTPResult.setText("result3");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//HTTPResult.setText("result4");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//HTTPResult.setText("result5");
StringBuilder stringBuilder = new StringBuilder();
//HTTPResult.setText("result6");
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}

result = stringBuilder.toString();
//result= "Sandeep";
} catch (ClientProtocolException e) {
result = "ClientProtocolException";
// TODO Auto-generated catch block
} catch (IOException e) {
result = "IOException";
// TODO Auto-generated catch block
}
return result;
}
@Override
protected void onPostExecute(String bitmap) {
super.onPostExecute(bitmap);
//HTTPResult.setText(result);
delegate.processFinish(bitmap);
}
}
}
public interface AsyncResponse  {
void processFinish(String output);
}

我的动机不是在HTTPResult中设置文本,而是设置字符串myResult;我正在使用HTTPResult 测试值

这个问题是因为AsyncTask在后台线程中执行任务,所以当你试图在EditText中设置结果时,AsyncTask可能还没有完成,所以你的myResult将有默认值来修复,你可以在onPostExecute方法中更新EditText,并且这一行在onPostExecute 中正常工作的原因

HTTPResult.setText(bitmap);

编辑:你可以在onPostExecute中更新myResult,但问题是要知道AsyncTask何时完成,所以你可以通过使用接口作为回调来解决这个问题

检查此问题以找到如何使用接口作为AsyncTask 的回调的示例

android异步任务向ui 发送回调

这是一个关于如何使用接口创建回调的好教程

https://www.tutorialspoint.com/Callback-using-Interfaces-in-Java

编辑2::将setText从onCreate移到您的processFinish函数中,或者您可以使用日志或toast进行检查,以在asynctask完成时更新ui,并将值推送到您的回调

@Override
public void processFinish(String output){
myResult = output;
HTTPResult.setText(myResult);
}