Android application crashing on 3G, slow connectio

2019-07-29 13:58发布

Im optimizing a simple android app that uses HTTP GET calls (with Apache HttpClient) to read data from a web server. The data that is transferred is in JSON format.

The application is pretty slow while on WIFI, but everytime the phone switches to 3G the app is getting the URL but it's failing to parse.

org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject

Im using AsyncTask to switch on a background thread:

    private class DownloadJSONRepertoire extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        progressBar.setVisibility(View.VISIBLE);
    }
    @Override
    protected Void doInBackground(Void... params) {
        arrayList = new ArrayList<HashMap<String, String>>();
        jsonObject = JSONfunctions.getJSONfromURL("http://example");
        try {

            jsonArray = jsonObject.getJSONArray("posts");
            for(int i = 0; i< jsonArray.length();i++)
            {
                HashMap<String,String> map = new HashMap<String,String>();
                JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                String url = jsonObject1.getString("url");
                String title = jsonObject1.getString("title");
                String content = jsonObject1.getString("content");
                map.put(SHAREURL,url);
                map.put(TITLE,title);
                map.put(CONTENT,content);
                JSONArray jsonArray1 = jsonObject1.getJSONArray("attachments");
                for(int j=0;j<jsonArray1.length();j++){
                    JSONObject jsonObject2 = jsonArray1.getJSONObject(j);
                    String urlImage = jsonObject2.getString("url");
                    map.put(URL, urlImage);
                    arrayList.add(map);

                }
            }
        }
        catch (JSONException e){
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void args){
        listView = (ListView) mActivity.findViewById(android.R.id.list);
        adapter = new ListViewAdapter(mActivity, arrayList);
        setListAdapter(adapter);
        adapter.notifyDataSetChanged();
        progressBar.setVisibility(View.INVISIBLE);
    }
}

JSONfunctions class:

public class JSONfunctions {
    public static JSONObject getJSONfromURL(String url) {
        InputStream is = null;
        String result = "";
        JSONObject jArray = null;

    // Download JSON data from URL
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);

        HttpResponse response = httpclient.execute(httppost);

        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {

        Log.e("log_tag", "Failed to connect" + e.toString());
    }

    // Convert response to string
    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();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    try {

        jArray = new JSONObject(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}
}

标签: android
1条回答
Explosion°爆炸
2楼-- · 2019-07-29 14:52

you are getting too much data in response so there might be possibility that in slow Internet connection connection get close
Either use better Volley or Retrofit

You can provide your own timeout and provide success and failure callback for network call

查看更多
登录 后发表回答