我是Android新手,我开发了一个应用程序来发布并从php服务器获取响应。
的AsyncTask
class MyTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://172.16.110.3/agent_tracking/index.php/api/rest/auth");
try {
// Add your data
List<BasicNameValuePair> nameValuePairs = new ArrayList<>(1);
nameValuePairs.add(new BasicNameValuePair("key", arg0[0]));
// nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
return responseString;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
主要类
Button login = (Button) findViewById(R.id.btn_login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText username = (EditText) findViewById(R.id.et_user_name);
EditText password = (EditText) findViewById(R.id.et_password);
String user_name = username.getText().toString();
String paswrd = password.getText().toString();
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
String data2 = user_name + "|" + paswrd + "|" + timeStamp;
byte[] data = new byte[0];
try {
data = data2.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String base64 = Base64.encodeToString(data, Base64.DEFAULT);
show_message(base64);
new MyTask().execute(base64);
//postData();
//startActivity(new Intent(MainActivity.this, mainmenu.class));
}
});
我的问题是从AsyncTask返回一个名为responseString
的值。我想从主类中捕获该值并将其显示在消息框中。
我试过这个
String result = new MyTask().execute(base64);
我收到错误无法比较的类型错误。
有人可以帮助我将返回的代码送到主类
答案 0 :(得分:2)
实现这一目标有多种方法。我正在逐步描述这种方式:
1 )在您的活动中创建一个方法,该方法将对活动执行所需的操作,例如。
public void showData(String responseString)
{
tvText.setText(responseString)
}
2 )当您在asyncTask中调用asyncTask传递活动对象时
new MyTask(MainClass.this).execute(base64);
3 )从onPostExecute调用showData方法,如:
mainclassObj.showData(response);
答案 1 :(得分:1)
基于answer @BlackBelt链接...这将为您解决问题:
String result = new MyTask().execute(base64).get();
答案 2 :(得分:0)
您可以覆盖AsyncTask的onPostExecute方法。返回值(responseString)是onPostExecute的参数。然后,您可以使用参数显示您的消息。
答案 3 :(得分:0)
您无法直接从异步方法返回任何数据,例如您发布的String result = new MyTask().execute(base64);
但要实现目标,您可以使用asynctask的onPostExecute()
方法
onPostExecute(String result) {
yourTextView.setText(result);
}
答案 4 :(得分:0)
必须通过Response回调来处理。哪个成功或失败案例都会被触发。我建议你使用网络管理库,比如loopj或者volley,它负责处理请求线程和回调。