Android 应用程序在 3G 上崩溃,连接速度慢,但可以通过 WIFI 运行

标签 android

我正在优化一个简单的 Android 应用程序,该应用程序使用 HTTP GET 调用(使用 Apache HttpClient)从 Web 服务器读取数据。 传输的数据为 JSON 格式。

应用程序在 WIFI 上非常慢,但每次手机切换到 3G 时,应用程序都会获取 URL,但无法解析。

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

我正在使用 AsyncTask 开启后台线程:

    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);
    }
}

JSON 函数类:

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;
}
}

最佳答案

您收到的响应数据过多,因此在缓慢的 Internet 连接中可能会关闭连接
要么使用更好VolleyRetrofit

您可以提供自己的超时时间,并为网络调用提供成功和失败的回调

关于Android 应用程序在 3G 上崩溃,连接速度慢,但可以通过 WIFI 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987024/

相关文章:

android - SQlite:数据库被锁定错误

android - Vimeo OAuth 2 认证

android - 为什么必须使用@+id 而不是@id?

android - 如何从 ListView 项中获取特定字符串

java - RxJava2 - 为多个 Rx 链重用运算符序列

android - 带有 mockito 测试的简单 kotlin 类导致 MissingMethodInvocationException

java - 触摸方向

java - Android Studio 不知道 Java 在哪里

android - 如何以编程方式打开 Android 6.0 (Marshmallow) 上特定应用的权限屏幕?

android - 适用于 Android 应用程序的 Google Places API key