【问题标题】:AsyncTask: How to return a HashMap from doInBackground?AsyncTask:如何从 doInBackground 返回 HashMap?
【发布时间】:2015-04-10 07:41:37
【问题描述】:

我目前正在android上做一个项目,当我测试函数doInBackground并将值返回一个字符串时,程序成功执行。

但是,在我的项目中,我想从服务器获取多个东西。所以我想用 HashMap 来帮助我完成这个。但它会引发错误。谁能告诉我为什么?另外,当我把String转成HashMap的时候,onPostExecute方法的override也报错了[Method does not override method from its superclass。

有人知道发生了什么吗? 我的代码如下所示。

class retrieveData extends AsyncTask<String,String,String> {
    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please Wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected HashMap<String, String> doInBackground(String... args){
        // new retrieveData().execute();
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        jsonObject = jsonParser.getJSONFromUrl(REG_URL, params);

        try {
            a = jsonObject.getString("key");
            b = jsonObject.getString("name");
            c = jsonObject.getString("gender");

            // creating new HashMap
            map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put("key", a);
            map.put("name", b);
            map.put("gender", c);

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return map;
    }

    // SuperClass does not have HashMap imposed...
    @Override
    protected void onPostExecute(HashMap<String, String> map){
        pDialog.dismiss();
        String aReceived = map.get("key");
        String bReceived = map.get("name");
        String cReceived = map.get("gender");
        tv.setText(aReceived + '\n' + bReceived + '\n' + cReceived);
    }
}

【问题讨论】:

  • 你能发布你的 logcat 吗?
  • 确保将 AsyncTask 扩展为 AsyncTask&lt;String, String, HashMap&lt;String, String&gt;&gt;
  • 你以json格式获取信息,你处理这些信息并将它们放入hashmap中,然后将其返回给onPostExecute(),然后将它们设置为textview
  • 很可能您没有更改 AsyncTask 定义中的返回值。你能展示一下你所有的 AsyncTask 吗?
  • (Eclipse)编写Async并按ctrl+space,将最后一个参数改为HashMap。

标签: java android android-asynctask hashmap return-value


【解决方案1】:

就这么简单,

    class A extends AsyncTask<String, String, HashMap<String, String>>
    {

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            // TODO Auto-generated method stub
        }

        @Override
        protected HashMap<String, String> doInBackground(String... params)
        {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        protected void onPostExecute(HashMap<String, String> result)
        {
            super.onPostExecute(result);
            // TODO Auto-generated method stub
        }
    }

【讨论】:

  • 是的,这是工作。谢谢。你能告诉我为什么我应该在 doInBackground 中返回 null 吗?
  • 不,那是自动生成的代码,你必须在那里传递 HashMap 对象。
【解决方案2】:

试试这个然后告诉我

class Loaddata extends AsyncTask<HashMap, HashMap, HashMap> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    protected HashMap<String, String> doInBackground(HashMap... args) {
        // Building Parameters
        HashMap<String, String> map = new HashMap<String, String>();
        try {

             List<NameValuePair> params = new ArrayList<NameValuePair>();

            // getting JSON string from URL
            jsonObject = jsonParser.getJSONFromUrl(REG_URL, params);

    try {
        a = jsonObject.getString("key");
        b = jsonObject.getString("name");
        c = jsonObject.getString("gender");

        // creating new HashMap
        map = new HashMap<String, String>();

        // adding each child node to HashMap key => value
        map.put("key", a);
        map.put("name", b);
        map.put("gender", c);

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

        } catch (Exception e) {

        }

        return map;
    }

     @Override
protected void onPostExecute(HashMap map){
    pDialog.dismiss();
    String aReceived = map.get("key");
    String bReceived = map.get("name");
    String cReceived = map.get("gender");
    tv.setText(aReceived + '\n' + bReceived + '\n' + cReceived);
}
}

【讨论】:

  • 我在 map.get("key") 后面添加了 .toString() 并遵循您的代码,但它不起作用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多