如何将多种数据类型传递给HashMap

时间:2017-03-28 06:09:38

标签: java hashmap

我正在尝试将字符串和int数据(可能是其他数据类型,如时间)传递给HashMap,以便在Android中的doinbackground任务中使用来修改URL。 URL使用键值对来更新mysql数据库。

我已经阅读了有关使用对象传递多种变量类型的信息,但无法使其发挥作用。

private void addChore(){

    final String title2 = editTextTaskTitle.getText().toString().trim();
    final String description2 = editTextDescription.getText().toString().trim();
    final String person2 = itemPerson.toString().trim();
    final int monday2 = cbMon;

    class NewChore1 {

        String title1;
        String description1;
        String person1;
        int monday1;

        NewChore1(String title1, String description1, String person1, int monday1){

            this.title1 = title1;
            this.description1 = description1;
            this.person1 = person1;
            this.monday1 = monday1;
        }
    }

    class AddChoreM extends AsyncTask<Void,Void,String> {

        ProgressDialog loading;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(AddChore.this,"Adding...","Wait...",false,false);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            Toast.makeText(AddChore.this,s,Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(Void... v) {
            HashMap<String, NewChore1> params1 = new HashMap<>();

            params1.put(Config.KEY_CHORE_TASK_TITLE,?);
            params1.put(Config.KEY_CHORE_DESCRIPTION,?);
            params1.put(Config.KEY_CHORE_PERSON,?);
            params1.put(Config.KEY_CHORE_MONDAY,?);

            RequestHandler rh = new RequestHandler();
            String res = rh.sendPostRequest(Config.URL_ADD, params1);
            return res;
        }
    }

    NewChore1 params = new NewChore1(title2, description2, person2, monday2);
    AddChoreM addChoreM = new AddChoreM();
    addChoreM.execute(params);
}

在RequestHandler中,我使用了以下内容。

private String getPostDataString(HashMap<String, Object> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, Object> entry : params.entrySet()) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }

    return result.toString();
}

3 个答案:

答案 0 :(得分:0)

AddChoreM类创建构造函数,并通过它设置NewChore1对象。您现在可以轻松地在NewChore1中提取doInBackground的属性。

class AddChoreM extends AsyncTask<Void,Void,String> {

  ProgressDialog loading;
  NewChore1 newChore1Obj;

  public AddChoreM(NewChore1 newChore1Obj){
          this.newChore1Obj = newChore1Obj;
  }

  @Override
  protected String doInBackground(Void...v) {
          HashMap<String, NewChore1> params1 = new HashMap<>();
          String res = "";
          if(newChore1Obj != null) {
                  params1.put(Config.KEY_CHORE_TASK_TITLE, newChore1Obj.title1);
                  params1.put(Config.KEY_CHORE_DESCRIPTION, newChore1Obj.description1);
                  params1.put(Config.KEY_CHORE_PERSON,newChore1Obj.person1);
                  params1.put(Config.KEY_CHORE_MONDAY,newChore1Obj.monday1);

                  RequestHandler rh = new RequestHandler();
                  res = rh.sendPostRequest(Config.URL_ADD, params1);
          }
          return res;
  }

  // Other methods of AsyncTask
  //
}

最后,像这样创建并执行AddChoreM

NewChore1 params = new NewChore1(title2, description2, person2, monday2);
AddChoreM addChoreM = new AddChoreM(params);
addChoreM.execute();

答案 1 :(得分:0)

如果您使用

Map<String, Object> params1 = new HashMap<>();

然后您可以将任何类型存储为地图中的值。

答案 2 :(得分:0)

编辑:我不够快,所以还有其他答案,但下面的更改应该有效。您可以将NewChore1对象传递给任务并在doInBackground中提取参数:

class AddChoreM extends AsyncTask<NewChore1,Void,String> {

  @Override
      protected String doInBackground(NewChore1...chore) {
              HashMap<String, String> params1 = new HashMap<>();

              params1.put(Config.KEY_CHORE_TASK_TITLE, chore[0].title1);
              params1.put(Config.KEY_CHORE_DESCRIPTION, chore[0].description1);
              params1.put(Config.KEY_CHORE_PERSON,chore[0].person1);
              params1.put(Config.KEY_CHORE_MONDAY,chore[0].monday1);

              RequestHandler rh = new RequestHandler();
              String res = rh.sendPostRequest(Config.URL_ADD, params1);

              return res;
  }

最后:

NewChore1 params = new NewChore1(title2, description2, person2, monday2);
new addChoreM.execute(params);

<强>更新 由于sendPostRequest仅接受HashMap<String, String>,因此您需要更改为:HashMap<String, String> params1 = new HashMap<>(); 并将您的NewChore1类更改为仅使用字符串。