我有5MB的JSON要下载,我提出了几个请求,将Web服务器的响应中断为300KB,我正在使用AsyncTask{}并能够成功下载所有数据,但这里的问题是下载和处理JSON数据需要很多时间……
下面是垃圾收集器运行得太频繁,但我不认为它实际上是在调用它的每个实例中释放内存。
有谁能解释一下json的首选大小是什么,可以毫不延迟地下载,或者是我从onPostExecute()调用同一个asynctask时内存泄漏的问题,还是http request(DefaultHttpClient-Apache)的缓冲区大小不够,我知道使用DownloadManager是一个选项,但有没有任何建议的方法来解决这个问题。
正在请求异步任务代码:

new DownloadJson().execute();

实际异步任务代码:
static class DownloadJson extends AsyncTask<String, String, String>{
    FirstTimeSyncParser jsonParser = new FirstTimeSyncParser();
    private PowerManager.WakeLock wl;

    protected void onPreExecute(){
        super.onPreExecute();
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
             getClass().getName());
        wl.acquire();
        pDialog = new ProgressDialog(context);
        pDialog.setMessage("Downloading 14 of 18 ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... arg0) {
        sqlHandler = new SqlHandler(context);
        tList = sqlHandler.selectTemp();
        for(Temp t:tList){
            deviceId = t.getDeviceId();
        }
        jsonReceived = new JSONObject();
        sList = new ArrayList<ActivityMark>();
        List<NameValuePair> param = new ArrayList<NameValuePair>();
        param.add(new BasicNameValuePair("tab_id", deviceId));
        param.add(new BasicNameValuePair("table_name", "activitymark"));
        param.add(new BasicNameValuePair("req_call",reqCall+""));
        jsonReceived = jsonParser.makeHttpRequest(urlSync, "POST", param);

        if(jsonReceived!=null){
            JSONArray sync = null;
            try{
                actMarkSuccess = jsonReceived.getInt(TAG_SUCCESS);
                if(actMarkSuccess == 1){
                    sync = jsonReceived.getJSONArray("Sync");
                    reqAgain = jsonReceived.getInt("req_again");
                    reqCall = reqAgain;
                    for(int i=0; i<sync.length(); i++){
                        JSONObject j = sync.getJSONObject(i);
                        ActivityMark m = new ActivityMark();
                        m.setExamId(j.getInt("ExamId"));
                        m.setActivityId(j.getInt("ActivityId"));
                        m.setMark(j.getString("Mark"));
                        m.setSchoolId(j.getInt("SchoolId"));
                        m.setStudentId(j.getInt("StudentId"));
                        m.setSubjectId(j.getInt("SubjectId"));
                        sList.add(m);
                    }
                    sqlHandler.initializeActivityMark(sList);
                }
            }
            catch(JSONException e){
                e.printStackTrace();
                reqAgain=0;
            }
        }

        sqlHandler.updateTables("activitymark");
        return null;
    }

    protected void onPostExecute(String s){
        super.onPostExecute(s);
        wl.release();
        pDialog.dismiss();
        if(actMarkSuccess == 0){
            SyncTime.updateSyncFailure(context);
            Intent i = new Intent();
            i.setClassName("in.schoolcom", "in.schoolcom.MainActivity");
            context.startActivity(i);
        }else{
            SyncTime.updateSyncProgress(context);
            if(reqAgain!=0){
            //  System.gc();
                tList.clear();
                new DownloadJson().execute();
            }else{

            }

        }

    }

}

最佳答案

唯一要考虑的是网络延迟。长时间运行的进程不应位于AsyncTasks中。它们应该在aService中。另外,您不必将文件存储在内存中,而是将其保存到一个文件中,以减少GC运行的次数。

08-18 12:33
查看更多