我想从php使用JSON加载数据,然后在android中解析它。我试图在这个过程中实现异步任务。返回值是字符串形式。我有一个错误"类型不匹配:
中无法从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);
}
}
我很抱歉我的英语不好。提前感谢
AsyncTask
的建议是在一个单独的线程中执行一些代码(不同于UI线程),但是该代码的结果,当准备好时,将在onPostExecute
中交付。方法execute
返回AynscTask
本身,而不是String
,因此将代码更改为
ProsesTampil p = new ProsesTampil();
xResult = p.execute(urltampil);
ProsesTampil p = new ProsesTampil();
p.execute(urltampil);
并在onPostExecute
方法中获得xResult作为
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
xResult = result;
}
首先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();
}
你不能这样做,因为AsyncTask工作在后台线程。你的结果将在后台完成自我工作后UI线程:
@Override
protected void onPostExecute(String result) {
//String result - that what you need
}
execute()
不返回字符串。所以你不能这样赋值。AsyncTasks
是异步的——它们稍后才完成。任何想在AsyncTask
的结果上运行的代码都应该放在AsyncTask
的onPostExecute()
函数中。
你可以使用
String results = yourAsyntask.get()
而不是使用yourAsyntask.execut()e
方法,它将返回结果。同样的结果得到你在onPostExecute
方法;
But it will block your main thread.