我有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运行的次数。