使用API网址下载大数据时遇到了麻烦。问题是,数据加载活动总是在后台运行,并且当数据集很大时线程不起作用(它适用于小数据集)。此外,在处理当前版本的此活动时, 以前版本的APK已受到影响 (之前运作良好)。
“运行”按钮与主应用程序一起单独显示DataLoadingActivity。
日志显示以下错误:
1。跳过32帧!应用程序可能在其主线程上做了太多工作。
2。资源是在附加的堆栈跟踪中获取的,但从未发布过。有关避免资源泄漏的信息,请参阅java.io.Closeable。
第3。尝试完成输入事件但输入事件接收器已经处理完毕。
注意:如果我在浏览器上运行它,API URL会正确显示JSON数据。
此段调用API并调用AsyncTask的方法:
getRequest(DataLoadingActivity.this, "http://url_goes_here", new VolleyApiCallback() {
@Override
public void onResponse(int status, String apiContent) {
if (status == AppConstants.SUCCESS_CODE) {
try {
allData = new JSONObject(apiContent);
//checking category label and parsing in different threads so that parsing time gets minimized
if (allData.has("Education")) {
new SaveEducationDBTask(DataLoadingActivity.this).execute(allData.getJSONArray("Education"));
}
if (allData.has("Finance")) {
new SaveFinancialDBTask(DataLoadingActivity.this).execute(allData.getJSONArray("Finance"));
}
// some more similar if-blocks
}
SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("_ward", wardClicked);
editor.putString("areakeyword", areaClicked);
editor.apply();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
SaveFinancialDBTask:
public class SaveFinancialDBTask extends GenericSaveDBTask <JSONArray, Integer, Long, FinNewDBTable, FinancialNewDBModel> {
public SaveFinancialDBTask(Context ctx) {
super(ctx);
}
@Override
public Long doInBackground(JSONArray... jsonArrays){
return super.doInBackground(new FinNewDBTable(context), new FinancialNewDBModel(), jsonArrays);
}
}
GenericSaveDBTask:
public abstract class GenericSaveDBTask <Params, Progress, Result, TableType extends BaseDBTable, ModelType extends BaseModel> extends AsyncTask<Params, Progress, Result> {
protected Context context;
public GenericSaveDBTask(Context ctx){
this.context = ctx;
}
@Override
protected void onPostExecute(Result result) {
Log.e(" Data collection : ", "done " + getClass());
if (((Long) result).longValue() == 0.0 && countofDb < NUMBER_OF_TASKS) { // Means the task is successful
countofDb++;
SharedPreferences settings = context.getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("KValue", countofDb);
editor.apply();
}
}
protected Long doInBackground(TableType table, ModelType model, JSONArray... jsonArrays) {
Log.e(" Data collection : ", "ongoing " + getClass());
JSONArray data = jsonArrays[0];
for (int i = 0; i < data.length(); i++) {
try {
if (!data.isNull(i)) {
JSONObject jsonObject = data.getJSONObject(i);
table.insertItem(model.parse(jsonObject));
}
} catch (JSONException e) {
e.printStackTrace();
return new Long(-1);
}
}
return new Long(0);
}
@Override
protected void onPreExecute(){
Log.e(" Data collection : ", "starting " + getClass());
}
}
界面VolleyApiCallback:
public interface VolleyApiCallback {
void onResponse(int status, String apiContent);
}
VolleyApiParser中的getRequest方法:
error.networkResponse.statusCode显示错误:
尝试从空对象上的字段'int com.android.volley.NetworkResponse.statusCode'读取 参考
public static void getRequest(final Context ctx, final String apiUrl,
final VolleyApiCallback vApiCb) {
getRequest(ctx, apiUrl, vApiCb, Request.Priority.NORMAL);
}
public static void getRequest(final Context ctx, final String apiUrl,
final VolleyApiCallback vApiCb,
final Request.Priority priority) {
if (!AppUtils.isNetConnected(ctx)) {
ToastMessageDisplay.setText(ctx,ctx.getString(R.string.connect_internet));
ToastMessageDisplay.showText(ctx);
return;
}
Character c=apiUrl.charAt(0);
Character c1= apiUrl.charAt(1);
if(c.equals('h')&&(c1.equals('t')))
{
FinalUrl=apiUrl;
}
else
FinalUrl= AppConstants.API_URL + apiUrl ;
StringRequest strReq = new StringRequest(
Request.Method.GET,
FinalUrl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Lg.i(TAG, VOLLEY_TAG + " : Response got: " + response);
vApiCb.onResponse(AppConstants.SUCCESS_CODE, response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
try {
if (error != null)
Lg.e(TAG, VOLLEY_TAG + " : Error : toString=" + error.toString()
+ ", net response code=" + error.networkResponse.statusCode
+ ", NetResponse data length = " + error.networkResponse.data.length);
else
Lg.e(TAG,
"onErrorResponse : VolleyError is also null (>_<)");
} catch (Exception e) {
e.printStackTrace();
}
vApiCb.onResponse(AppConstants.ERR_VOLLEY_CODE,
"API Response error! Check connection & tried URL ...");
}
}) {
@Override
public Priority getPriority() {
return priority;
}
@Override
public Object getTag() {
return VOLLEY_TAG;
}
};
VolleySingleton.getInstance(ctx).addToRequestQueue(strReq);
}
Error log on attempting to fetch data from URL
有人可以建议现在应该做些什么来阻止背景活动吗?我是Android应用开发的新手。