如何使JSONParser类适用于Android ICS及更新?

时间:2013-02-22 20:21:17

标签: android httprequest

此代码适用于较旧的api版本,例如。我在API8-2.2上使用它,它做了我想要的。

但是当试图在我的手机上使用Android 4.2.1运行应用程序时,它只是崩溃了。我试图在互联网上找到这个问题并发现我需要一些名为Asyntask的东西,所以我开始寻找它,但我仍然不理解它。有人可以帮我解决这个问题吗?

package com.thevnkid93.ucebnice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

    public class JSONParser {

        static InputStream is = null;
        static JSONObject jObj = null;
        static JSONArray jArr=null;
        static String json = "";

        // function get json from url
        // by making HTTP POST or GET method
        public static JSONArray makeHttpRequest(String url, String method,
                List<NameValuePair> params) {

            // Making HTTP request
            try {
                // check for request method
                if(method == "POST"){
                    // request method is POST
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);
                    httpPost.setEntity(new UrlEncodedFormEntity(params,"utf-8"));

                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();

                }else if(method == "GET"){
                    // request method is GET
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    String paramString = URLEncodedUtils.format(params, "utf-8");
                    url += "?" + paramString;
                    HttpGet httpGet = new HttpGet(url);

                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();
                }           

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

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jArr = new JSONArray(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // return JSON String (Array)
            return jArr;

        }

}

logcat的:

02-23 23:01:10.540:E / AndroidRuntime(30520):android.os.NetworkOnMainThreadException

1 个答案:

答案 0 :(得分:1)

查看您的代码,将其转换为AsyncTask非常容易。只需将JSONParser. makeHttpRequest()放入AsyncTask的doInBackground()方法。

但是,您可能可以使用Thread,因为您没有在代码中进行任何UI修改。

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            JSONArray myArray = JSONParser. makeHttpRequest();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();