简体   繁体   中英

How to make a JSONParser class work for Android ICS and newer?

This code works pretty well for older api version, eg. I have used it on API8-2.2 and it does what I wanted.

But when tried to run the app on my phone with Android 4.2.1, it just crashed. I tried to find this issue on the internet and found out that I need something called Asyntask, so I started to look for it, but I still don't understand it. Can anybody help me with that issue?

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

Looking at your code, it would be really easy to convert it to an AsyncTask . Just drop a JSONParser. makeHttpRequest() JSONParser. makeHttpRequest() into the doInBackground() method of the AsyncTask.

However, you could probably get away with using a Thread , as you aren't doing any UI modification in your code.

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

thread.start();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM