我想从php加载数据,然后在android中解析它。我试图在这个过程中实现asynctask。返回是字符串。我收到了一个错误 "类型不匹配:无法在
中从AsyncTask<String,String,String>
转换为String
ProsesTampil p = new ProsesTampil();
xResult = p.execute(urltampil);
xResult
应该是我从php获得的字符串值。
这是完整的代码:
public void tampilkanData() {
try {
String nama = URLEncoder.encode(Login.usernameP, "utf-8");
urltampil += "?" + "&nama=" + nama;
txtNama.setText("");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ProsesTampil p = new ProsesTampil();
xResult = p.execute(urltampil);
try {
parse();
} catch (Exception e) {
e.printStackTrace();
}
}
private void parse() throws Exception {
//jObject = new JSONObject(xResult);
JSONArray menuitemArray = new JSONArray(xResult);
jObject=menuitemArray.getJSONObject(0);
String sret="";
txtBerat.setText(jObject.getString("berat_badan"));
txtNama.setText(jObject.getString("username"));
// txtUsia.setText(jObject.getString("usia"));
txtTinggi.setText(jObject.getString("tinggi_badan"));
//System.out.println(jObject.getString("jenis_kelamin").equalsIgnoreCase("female"));
if(jObject.getString("jenis_kelamin").equalsIgnoreCase("female")){
radioFemale.setSelected(true);
radioMale.setSelected(false);
}else{
radioMale.setSelected(true);
radioFemale.setSelected(false);
}
}
public String getRequestData(String UrlTampil){
String sret="";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(UrlTampil);
try{
HttpResponse response = client.execute(request);
sret =request(response);
}catch(Exception ex){
Toast.makeText(this,"Gagal "+sret, Toast.LENGTH_SHORT).show();
}
System.out.println(sret);
return sret;
}
class ProsesTampil extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... params) {
return getRequestData(params[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
对不起我的英语不好。提前谢谢
答案 0 :(得分:2)
AsyncTask
的建议是在一个单独的线程中执行一些代码(与 UI线程不同),但该代码的结果在准备好后将在{{{{1>}中传递。 1}}。
即方法onPostExecute
会返回execute
本身,而非AynscTask
,因此请将代码更改为
String
到
ProsesTampil p = new ProsesTampil();
xResult = p.execute(urltampil);
将ProsesTampil p = new ProsesTampil();
p.execute(urltampil);
方法中的xResult作为
onPostExecute
答案 1 :(得分:0)
execute()
没有返回字符串。所以你不能那样分配它。 AsyncTasks
是异步的 - 他们要等到晚些时候才能完成。您希望在AsyncTask
的结果上运行的任何代码都应放在onPostExecute()
的{{1}}函数中。
答案 2 :(得分:0)
First Thing您无法从onPostExecute()
返回值,因为返回类型为void
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
第二,你的班级没有任何价值......
因此,如果您想获得结果值,请尝试从onPostExecute()
获取值。
我的意思是说按照以下方式行事......
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
xResult = result;
super.onPostExecute();
}
答案 3 :(得分:0)
你不能这样做,因为AsyncTask在后台线程中工作。 在后台完成自我工作后,您的结果将出现在UI线程中:
@Override
protected void onPostExecute(String result) {
//String result - that what you need
}
答案 4 :(得分:-1)
哟可以使用
String results = yourAsyntask.get()
而不是使用yourAsyntask.execut()e
方法,它会返回结果。与结果相同,让您进入onPostExecute
方法;
But it will block your main thread.