gpt4 book ai didi

Android 在 AsyncTask 中下载大型 JSON

转载 作者:太空狗 更新时间:2023-10-29 15:04:56 26 4
gpt4 key购买 nike

我有 5MB 的 JSON 要下载,我发出了几个请求,将 Web 服务器的响应中断到 300KB,我正在使用 AsyncTask{} 并能够成功下载所有数据,但问题这里是下载和处理JSON数据需要很多时间...

下面是垃圾收集器运行过于频繁但我不认为它实际上在每个被调用的实例中释放内存。 garbage collector trying to free memory

任何人都可以澄清可以立即下载的 JSON 的首选大小是多少,或者它是内存泄漏的问题,因为我从 onPostExecute() 调用相同的异步任务或 的缓冲区大小code>http request(DefaultHttpClient-Apache) 是不够的,我知道使用 DownloadManager 是一种选择,但有没有推荐的方法来解决这个问题。

请求AsyncTask代码:

new DownloadJson().execute();

实际的 AsyncTask 代码:

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 中。它们应该在 Service 中。还有,你不必把文件存入内存,把它保存到一个文件中可以减少GC运行的次数。

关于Android 在 AsyncTask 中下载大型 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com