由于“在主线程上工作太多”,因此未下载数据

时间:2017-11-07 08:57:49

标签: android multithreading android-activity android-asynctask android-volley

使用API​​网址下载大数据时遇到了麻烦。问题是,数据加载活动总是在后台运行,并且当数据集很大时线程不起作用(它适用于小数据集)。此外,在处理当前版本的此活动时, 以前版本的APK已受到影响 (之前运作良好)。

“运行”按钮与主应用程序一起单独显示DataLoadingActivity。

The RUN button shows the DataLoadingActivity separately along with the main app.

日志显示以下错误:

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应用开发的新手。

0 个答案:

没有答案