错误无法从异步任务<字符串,字符串>转换为字符串



我想从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的结果上运行的代码都应该放在AsyncTaskonPostExecute()函数中。

你可以使用

String results = yourAsyntask.get()而不是使用yourAsyntask.execut()e方法,它将返回结果。同样的结果得到你在onPostExecute方法;

But it will block your main thread.

最新更新