使用Android的AsyncTask在Java中编写DRY HTTP请求处理程序

时间:2015-12-12 04:46:39

标签: java android android-asynctask

我正在寻找一些关于代码中的错误的帮助。我正在从头开始为我的Android应用程序编写一个HTTP请求处理程序,它工作正常,但我在分割POSTGET的不同部分时遇到问题。它们有一些相同的逻辑,所以我试图将它保持为一个if子句。我正在扩展AsyncTask所以我有doInBackgroundonPostExecute方法来处理实际请求,然后分别处理结果。我正在测试的请求是GET请求。

构造

public <T extends Exhibitable> HTTPRequestHandler(T exhibiter, String verb, String url) throws MalformedURLException {
    this.exhibiter = exhibiter;
    this.verb = verb;
    this.url = url;

    try {
        mUrlConnection = new URL(url).openConnection();
        mUrlConnection.setDoInput(true);
        mUrlConnection.setDoOutput(true);
        mUrlConnection.setUseCaches(false);
    } catch (MalformedURLException e) {
        Log.e("Debug", "MalformedURLException", e);
    } catch (IOException e) {
        Log.e("Debug", "IOException1", e);
    }
}

exhibitor只是为了在我的onPostExecute方法中,我可以调用它的命令并让它以我想要的方式显示我的数据。

问题代码

我的doInBackground方法是我遇到错误的地方。我想要

protected String doInBackground(String... params) {

    String tmp;

    try {
      mUrlConnection.connect();
      this.in = new DataInputStream(mUrlConnection.getInputStream());
      this.out = new DataOutputStream(mUrlConnection.getOutputStream());

      if(verb.equalsIgnoreCase("POST")){
          out.write(requestParams.toString().getBytes("UTF-8"));
      }

      while((tmp = in.readLine()) !=null){
          mStringBuffer.append(tmp);
      }

    }catch (IOException e){
        e.printStackTrace();
    }

  return mStringBuffer.toString();
}

我得到一个JSONException: Expected literal value...它实际上似乎并没有获取数据。

中抛出了异常

onPostExecute

public void onPostExecute(String result){
    super.onPostExecute(result);
    Log.d("Debug", "Result is: "+result);
    try {
        exhibiter.exhibit(new JSONObject("{'result':"+result+"}"));
    }catch (JSONException e){
        Log.e("Debug", "JSONException", e);
    }
}

的作用是以下代码。

工作请求

protected String doInBackground(String... uri)
    if(verb.equalsIgnoreCase("GET")){

        try {
            while((tmp = in.readLine()) !=null){
                mStringBuffer.append(tmp);
            }
        }catch (IOException e){
            Log.e("Debug", "IOException2", e);
        }
    }else if(verb.equalsIgnoreCase("POST")){
        try {
            while((tmp = in.readLine()) !=null){
                mStringBuffer.append(tmp);
            }
            out.flush();
            out.close();
        }catch (IOException e){
            Log.e("Debug", "IOException3", e);
        }

    }else{
        return "No valid request specified.";
    }

    return mStringBuffer.toString();
}

这取决于我在服务器上获得的结果 - 它给了我想要的东西,但它不是很干。什么给出了什么?这些似乎与我完全相同。唯一真正不同的是,在工作块中,我给mStringBuffer.append(tmp);自己的try catch块。我已经尝试将其插入所需的代码块,但它仍然无法正常工作。那么我对AsyncTask还缺少什么?

0 个答案:

没有答案