从Asynctask返回字符串

时间:2015-02-27 12:22:09

标签: android json android-asynctask

我正在尝试解析jsonObject,但我无法将结果从 doInBackground 导入 onPostExecute

这是我的AsyncTask代码:

private class GetContacts extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MyActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);
        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);
                String auth2 = jsonObj.getString("auth");

            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void auth2) {
        super.onPostExecute(auth2);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        Toast.makeText(getApplicationContext(), "String retrived:" + auth2, Toast.LENGTH_SHORT).show();
    }

}

我知道它可能是因为我在那里返回null,但是当我返回字符串然后我得到错误。

我知道jsonStr实际上持有json数据,我可以在日志中看到它: 响应::&gt; {&#34; USER_INFO&#34; {&#34; AUTH&#34;:0}}

我把这些代码放在教程中,这就是为什么我不完全理解它。

我的目标是查看auth是0还是1。

2 个答案:

答案 0 :(得分:8)

  

无法将doInBackground中的结果输入onPostExecute

auth2返回doInBackground字符串:

1。doInBackground方法的返回类型从Void更改为String

 @Override
    protected String doInBackground(Void... arg0) {

   }

2。AsyncTask的最后一般类型从Void更改为String

private class GetContacts extends AsyncTask<Void, Void, String> 

3。从doInBackground返回auth2

  String auth2 = jsonObj.getString("auth");
  return auth2;

4。onPostExecute参数类型从Void更改为String

@Override
    protected void onPostExecute(String auth2) {
        super.onPostExecute(auth2);
        //...
        Toast.makeText(getApplicationContext(),
            "String retrived:" + auth2, Toast.LENGTH_SHORT).show();
    }

答案 1 :(得分:0)

阅读文档: http://developer.android.com/reference/android/os/AsyncTask.html

private class GetContacts extends AsyncTask<Void, Void, String> {


    @Override
    protected String doInBackground(Void... arg0) {


        ...
        return "askdjalskdj";
    }

    @Override
    protected void onPostExecute(String auth2) {
        Log.i("Output", auth2);
    }

}

参见我在Asynctask的通用实现中设置的参数,参见doInBackground定义的返回值和onPostExecute的参数类型

  

AsyncTask的泛型类型异步任务使用的三种类型如下:

     
      
  1. Params,执行时发送给任务的参数类型。
  2.   
  3. 进展,期间发布的进度单位的类型   背景计算。
  4.   
  5. 结果,结果的类型   背景计算。
  6.         

    并非所有类型都始终使用   异步任务。要将类型标记为未使用,只需使用类型Void:

         

    私有类MyTask扩展了AsyncTask {...}