Json响应非常慢的android

时间:2014-09-01 13:01:51

标签: java android performance android-json

我正在编写一个Android应用程序,有时需要下载大约1MB的json字符串并包含大约1000个元素,并将其中的每一个解析为SQLite数据库,我用它来填充ListActivity。

即使下载和解析不是每次与应用程序交互时都需要完成的事情(仅在第一次运行时或用户选择刷新数据时),我仍然担心解析部分是花费太长时间,大约需要两到三分钟 - 在手机应用程序方面似乎是永恒的!

我正在使用此代码......: -

            public class CustomerAsyncTask extends AsyncTask<String, Integer, String> {
            private Context context;
            private String url_string;
            private String usedMethod;
            private String identifier;
            List<NameValuePair> parameter;
            private boolean runInBackground;
            AsynTaskListener listener;
            private Bitmap bm = null;

            public ProgressDialog pDialog;
            public String entityUtil;
            int index = 0;
            public static int retry = 0;

            private String jsonString = "";

            private String DialogString = "";

            // use for AsyncTask web services-----------------
            public CustomerAsyncTask(Context ctx, String url, String usedMethod,
                    String identifier, boolean runInBackground, String DialogString,
                    List<NameValuePair> parameter, AsynTaskListener callack) {
                this.context = ctx;
                this.url_string = url;
                this.usedMethod = usedMethod;
                this.identifier = identifier;
                this.parameter = parameter;
                this.runInBackground = runInBackground;
                this.listener = callack;
                this.DialogString = DialogString;
            }

            public CustomerAsyncTask(Context ctx, String url, String usedMethod,
                    String identifier, boolean runInBackground,
                    List<NameValuePair> parameter, AsynTaskListener callack, Bitmap bm) {
                this.context = ctx;
                this.url_string = url;
                this.usedMethod = usedMethod;
                this.identifier = identifier;
                this.parameter = parameter;
                this.runInBackground = runInBackground;
                this.listener = callack;
                this.bm = bm;

            }

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                if (runInBackground)
                    initProgressDialog(DialogString);
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                // TODO Auto-generated method stub
                super.onProgressUpdate(values);
            }

            @SuppressWarnings("deprecation")
            @Override
            protected String doInBackground(String... params) {
                HttpParams httpParameters = new BasicHttpParams();
                int timeoutConnection = 10000; // mili second
                HttpConnectionParams.setConnectionTimeout(httpParameters,
                        timeoutConnection);
                int timeoutSocket = 10000;
                HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                try {
                    HttpResponse response = null;
                    if (usedMethod.equals(GlobalConst.POST)) {
                        HttpPost httppost = new HttpPost(this.url_string);
                        httppost.setHeader("Content-Type",
                                "application/x-www-form-urlencoded");
                        // Customer Login MObile
                        if (identifier.equals("Customer_Login")) {
                            if (params.length > 0) {
                                parameter = new ArrayList<NameValuePair>();
                                parameter.add(new BasicNameValuePair("cus_mob",
                                        params[0]));
                            }
                            httppost.setEntity(new UrlEncodedFormEntity(parameter));

                            // Customer Verify Code
                        } else if (identifier.equals("Customer_mob_verify")) {
                            if (params.length > 0) {
                                parameter = new ArrayList<NameValuePair>();
                                parameter.add(new BasicNameValuePair("cus_verify",
                                        params[0]));
                                parameter.add(new BasicNameValuePair("cus_mobile",
                                        params[1]));
                            }
                            httppost.setEntity(new UrlEncodedFormEntity(parameter));
                        } else if (identifier.equals("Dashboard")) {
                            if (params.length > 0) {
                                parameter = new ArrayList<NameValuePair>();
                                parameter.add(new BasicNameValuePair("cus_id",
                                        params[0]));
                            }
                            httppost.setEntity(new UrlEncodedFormEntity(parameter));
                        }
                        response = (HttpResponse) httpClient.execute(httppost);

                    } else if (usedMethod.equals(GlobalConst.GET)) {

                        HttpGet httpput = new HttpGet(this.url_string);
                        httpput.setHeader("Content-Type",
                                "application/x-www-form-urlencoded");
                        response = (HttpResponse) httpClient.execute(httpput);
                    }

                    // Buffer Reader------------------------
                    InputStream inputStream = null;
                    String result = null;
                    try {
                        HttpEntity entity1 = response.getEntity();
                        inputStream = entity1.getContent();
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(inputStream, "UTF-8"), 8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                        result = sb.toString();
                    } catch (Exception e) {
                    } finally {
                        try {
                            if (inputStream != null)
                                inputStream.close();
                        } catch (Exception squish) {
                        }
                    }
                    jsonString = result;
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                    return AsyncResultConst.CONNEERROR;
                } catch (IOException e) {
                    e.printStackTrace();
                    return AsyncResultConst.CONNEERROR;
                } catch (Exception e1) {
                    e1.printStackTrace();
                    return AsyncResultConst.EXCEPTION;
                } finally {
                    httpClient.getConnectionManager().shutdown();
                }
                return AsyncResultConst.SUCCESS;
            }

            @Override
            protected void onPostExecute(String result) {
                // TODO Auto-generated method stub
                if (runInBackground)
                    pDialog.dismiss();
                if (result.equals(AsyncResultConst.SUCCESS)) {
                    listener.onRecieveResult(identifier, jsonString);
                } else if (result.equals(AsyncResultConst.PARSINGERROR)) {
                    // showAlertMessage(context, "Error", "Parsing Error", null);
                    listener.onRecieveException(identifier, result);
                } else {
                    if (retry < 0) {
                        retry++;
                        new CustomerAsyncTask(context, url_string, usedMethod,
                                identifier, runInBackground, DialogString, parameter,
                                listener).execute("");
                    } else {
                        // showAlertMessage(context, "Error", "Connection Error", null);
                        listener.onRecieveException(identifier, result);
                    }
                }
                super.onPostExecute(result);
            }

            private void initProgressDialog(String loadingText) {
                pDialog = new ProgressDialog(this.context);
                pDialog.setMessage(loadingText);
                pDialog.setCancelable(false);
                pDialog.show();
            }
        }

5 个答案:

答案 0 :(得分:1)

在这种情况下不要使用Async-task,请在此处使用本机java线程。

 new Thread(new Runnable() {
        public void run() {

             // Do your work .....

        }
    }).start();  

何时需要更新UI。是! Android不允许你这样做。所以...解决方案是:USE Handler:)

 Handler handler = new Handler(); 

 handler.post(new Runnable() {
      @Override
      public void run() {

           // Do Update your UI     

       }    
 });

使用AsyncTask:

  1. 简单的网络操作,不需要下载很多
  2. 数据可能需要几毫秒的磁盘绑定任务
  3. 使用Java线程:

    1. 涉及中等到大量数据(上传或下载)的网络操作
    2. 需要在后台运行的高CPU任务
    3. 您想要控制相对于GUI线程的CPU使用率的任何任务

答案 1 :(得分:0)

尝试使用Jackson Library来管理您的JSON。这真的很有效率。您可以在此处找到它:http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-jaxrs

我将它用于400KB文件的时间不到1秒。

如果你想要一个tuto,那么这个好看http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

答案 2 :(得分:0)

您也可以使用Google的GSON。

答案 3 :(得分:0)

这是如何在我的应用程序中将JSON读入我的listview。结果在Wi-Fi上平均3秒处理到我的应用程序,在3G上处理5秒:

公共类CoreTeamFragment扩展了ListFragment {     的ArrayList&GT; membersList;     private String url_all_leaders = // URL在这里     私人ProgressDialog pDialog;

JSONParser jParser = new JSONParser();

// JSON Node names
private static final String CONNECTION_STATUS = "success";
private static final String TABLE_TEAM = "CoreTeam";
private static final String pid = "pid";
private static final String COL_NAME = "CoreTeam_Name";
private static final String COL_DESC = "CoreTeam_Desc";
private static final String COL_PIC = "CoreTeam_Picture";

JSONArray CoreTeam = null;

public static final String ARG_SECTION_NUMBER = "section_number";

public CoreTeamFragment() {
}

public void onStart() {
    super.onStart();

    membersList = new ArrayList<HashMap<String, String>>();
    new LoadAllMembers().execute();

    // selecting single ListView item
    ListView lv = getListView();

    // Lauching the Event details screen on selecting a single event
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String ID = ((TextView) view.findViewById(R.id.leader_id))
                    .getText().toString();

            Intent intent = new Intent(view.getContext(),
                    CoreTeamDetails.class);
            intent.putExtra(pid, ID);
            view.getContext().startActivity(intent);
        }
    });
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_coreteam,
            container, false);

    return rootView;
}

class LoadAllMembers extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Just a moment...");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_all_leaders,
                "GET", params);

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(CONNECTION_STATUS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                CoreTeam = json.getJSONArray(TABLE_TEAM);
                // looping through All Contacts
                for (int i = 0; i < CoreTeam.length(); i++) {
                    JSONObject ct = CoreTeam.getJSONObject(i);

                    // Storing each json item in variable
                    String id = ct.getString(pid);
                    String name = ct.getString(COL_NAME);
                    String desc = ct.getString(COL_DESC);
                    String pic = ct.getString(COL_PIC);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(pid, id);
                    map.put(COL_NAME, name);
                    map.put(COL_DESC, desc);
                    map.put(COL_PIC, pic);

                    // adding HashList to ArrayList
                    membersList.add(map);

                }
            } else {
                // Options are not available or server is down.
                // Dismiss the loading dialog and display an alert
                // onPostExecute
                pDialog.dismiss();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread
        getActivity().runOnUiThread(new Runnable() {
            public void run() {
                ListAdapter adapter = new SimpleAdapter(
                        getActivity(),
                        membersList,
                        R.layout.coreteam_item,
                        new String[] { pid, COL_NAME, COL_DESC, COL_PIC },
                        new int[] { R.id.leader_id, R.id.leaderName,
                                R.id.photo });
                setListAdapter(adapter);
            }
        });
    }
}

}

答案 4 :(得分:0)

使用Volley或Retrofit lib。

那些lib正在提高速度。

排球:

JsonObjectRequest channels = new JsonObjectRequest(Method.POST,
                Constants.getaccountstatement + Constants.key, statement_object,
                new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject arg0) { 
}, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError e) {
                Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();
}