Retrofit和SQlite如何消除滞后

时间:2015-10-07 11:04:26

标签: android json sqlite

我使用Retrofit库从服务器获取和解析JSON。 应用程序启动时,我在MainActivity中运行的所有方法。当我检查数据库中是否存在Object(从JSON解析)时,我遇到了麻烦。应用程序没有响应。我该怎么办?

这是MainActivity:

公共类MainActivity扩展FragmentActivity实现了MYFragmentListener,OnBackPressedListener {

public static String FRAGMENT_INSTANCE_NAME = "";
public static String PACKAGE_NAME;

private DrawerLayout mDrawerLayout;
DrawerAdapter listAdapter;


private Level level;


private String drawerlist[];
public static DrawerLayout drawer_layout;
private ListView mDrawerList;
private int EXPAND_GROUP;
private int SELECTED_CHILD;
private int LANGUAGE_POSITION;


int height;

public AsanaPOJO [] asanasPOJO;

private List<String> listDataHeader;
private List<String> listData;
private HashMap<String, List<String>> listDataChild;
private ExpandableListView expListView;
private ExpandableListView.LayoutParams expParam;
private LinearLayout expListLay;
private List<String> language;


private FragmentTransaction fTrans;
private FragmentManager fm;



private mainFragmentPh main_fragment_ph;
private StepOnePh step_one_ph;
private StepTwoPh step_two_ph;
private ProgramsVideoPh program_video_ph;
private ProgramOnePh program_one_ph;
private ProgramsPh programs_ph;
private AsanaOnePh asana_one_ph;
private AsanasPh asanas_ph;
private Finish2Ph finish2_ph;

private mainFragmentTb main_fragment_tb;
private ProgramAddTb program_add_tb;
private ProgramsVideoTb programs_video_tb;
private ProgramOneTb program_one_tb;
private ProgramsTb programs_tb;
private AsanaOneTb asana_one_tb;
private AsanasTb asanas_tb;
private Finish2Tb finish2_tb;
private AsanaInfoTb asana_info_tb;

Fragment fragment;


private Finish finish;
private add add_d;





boolean drawer_st;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);



    PACKAGE_NAME = getApplicationContext().getPackageName();
    LANGUAGE_POSITION=-1;

    language = new ArrayList();
    final MYDBHelperFromApi DBHelperAPI = new MYDBHelperFromApi(this);


    MYapi myapi = (MYapi) new Builder().setLogLevel(LogLevel.FULL).setEndpoint(MYurl.BASE_URL).build().create(MYapi.class);
    myapi.getLanguages(new Callback<HashMap<String, String>>() {
        public void success(HashMap<String, String> hashMap, Response response) {
            language.addAll(hashMap.values());
            Log.d("LOGS", hashMap.toString() + " " + response.toString());
            DBHelperAPI.addLanguages(hashMap);
        }

        public void failure(RetrofitError error) {
            Log.d("LOGS", "FUUUUUUUUUUUU");
        }
    });
    myapi.getLevelList(new Callback<List<AsanaLevel>>() {
        public void success(List<AsanaLevel> asanaLevels, Response response) {
            for (AsanaLevel a : asanaLevels) {
                Log.d("LEVELASANA LOGS", BuildConfig.FLAVOR + a.toString());
            }
            DBHelperAPI.addAsanaLevel(asanaLevels);
        }

        public void failure(RetrofitError error) {
        }
    });
    myapi.getTypeList(new Callback<List<AsanaType>>() {
        public void success(List<AsanaType> asanaTypes, Response response) {
            for (AsanaType a : asanaTypes) {
                Log.d("TYPEASANA LOGS", BuildConfig.FLAVOR + a.toString());
            }
            DBHelperAPI.addAsanaType(asanaTypes);
        }

        public void failure(RetrofitError error) {

        }
    });
    myapi.getProgramGoalList(new Callback<List<ProgramGoal>>() {
        public void success(List<ProgramGoal> programGoals, Response response) {
            for (ProgramGoal a : programGoals) {
                Log.d("GOALPROGRAM LOGS", BuildConfig.FLAVOR + a.toString());
            }
            DBHelperAPI.addProgramGoal(programGoals);
        }

        public void failure(RetrofitError error) {
        }
    });
    myapi.getProgramLevelList(new Callback<List<ProgramLevel>>() {
        public void success(List<ProgramLevel> programLevels, Response response) {
            for (ProgramLevel a : programLevels) {
                Log.d("LevelPROGRAM LOGS", BuildConfig.FLAVOR + a.toString());
            }
            DBHelperAPI.addProgramLevel(programLevels);
        }

        public void failure(RetrofitError error) {
        }
    });
    myapi.getAsanas(new Callback<Asanas>() {
        public void success(Asanas asanas,
                            Response response) {

            DBHelperAPI.addAsanas(asanas);
            List<Integer> listDB = DBHelperAPI.getAsanasIds();
            DBHelperAPI.checkForDeletedAsanas(asanas, listDB);
            for (AsanaPOJO a : asanas.getAsanas()) {
                Log.d("AsanaPROGRAM LOGS", BuildConfig.FLAVOR + a.getName());
            }
        }

        public void failure(RetrofitError error) {
            Log.d("FAILURE", "Failure");
        }
    });

    myapi.getPrograms(new Callback<Programs>() {
        @Override
        public void success(Programs programs, Response response) {
            DBHelperAPI.addPrograms(programs);
            for (ProgramPOJO p : programs.getPrograms()) {
                Log.d("PROGRAMs LOGS", BuildConfig.FLAVOR + p.getName());
            }
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });


    expListLay =(LinearLayout) findViewById(R.id.expListlay);



    ..................

}

来自DBhelper的

和方法:

public void addPrograms(Programs programs){
open();
ContentValues values = new ContentValues();

for (ProgramPOJO p : programs.getPrograms()) {
    values.put(KEY_ID,p.getId());
    values.put(KEY_DURATION,p.getDuration());
    values.put(KEY_MAX_AGE,p.getMax_age());
    values.put(KEY_MIN_AGE,p.getMin_age());
    values.put(KEY_ISPAID,p.checkBool(p.getIs_paid()));
    values.put(KEY_IS_QUICK_RECEIPT,p.checkBool(p.getIs_quick_receipt()));
    values.put(KEY_BACKGROUND_SOUND_ID,p.getBackground_sound_id());
    values.put(KEY_IMGLARGE,p.getImgLarge());
    values.put(KEY_IMGTHUMB,p.getImgThumb());
    values.put(KEY_NAME,p.getName());
    values.put(KEY_GOAL_ID,p.getGoal_id());
    values.put(KEY_LEVEL_ID,p.getLevel_id());
    values.put(KEY_OLDPK,p.getOld_pk());
    if (checkById(TABLE_PROGRAMS, KEY_ID, p.getId())) {

        Log.d("LOGSPROGRAMOnly", " allready exist");

    } else {
        this.dbase.insert(TABLE_PROGRAMS, null, values);

        Log.d("LOGSPROGRAMOnly", p.getName() + " added");

    }
    for (Poses poses :p.getPoses()){
        ContentValues valuesForPose = new ContentValues();
        valuesForPose.put(KEY_ID,poses.getId());
        valuesForPose.put(KEY_POSITION,poses.getPosition());
        valuesForPose.put(KEY_DURATION,poses.getDuration());
        valuesForPose.put(KEY_VOICE,poses.getVoice());
        valuesForPose.put(KEY_ASANA_ID,poses.getAsana_id());
        valuesForPose.put(KEY_OLDPK,poses.getOld_pk());
        if (checkById(TABLE_POSES, KEY_ID, poses.getId())) {

            Log.d("LOGSPose", " allready exist");

        } else {
            this.dbase.insert(TABLE_POSES, null, valuesForPose);

            Log.d("LOGSPose", p.getName() + " added");


        }

        ContentValues valuesForPoseProgram = new ContentValues();
        valuesForPoseProgram.put(KEY_PROGRAM_ID, p.getId());
        valuesForPoseProgram.put(KEY_POSE_ID, poses.getId());
        if (checkPoseById(p.getId(), poses.getId())) {

            Log.d("LOGSPROGRAMPose", " allready exist");

        } else {
            this.dbase.insert(TABLE_POSES_PROGRAMS, null, valuesForPoseProgram);

            Log.d("LOGSPROGRAMPose", p.getName() + " added");


        }
    }
}

}

public void addAsanas(Asanas asanas) {
open();

ContentValues values = new ContentValues();
for (AsanaPOJO a : asanas.getAsanas()) {

    values.put(KEY_ID, Integer.valueOf(a.getId()));
    values.put(KEY_NAME, a.getName());
    values.put(KEY_IMGLARGE, a.getImgLarge());
    values.put(KEY_IMGTHUMB, a.getImgThumb());
    values.put(KEY_LEVELID, Integer.valueOf(a.getLevel_id()));
    values.put(KEY_TYPEID, Integer.valueOf(a.getType_id()));
    values.put(KEY_AUDIO, a.getAudio());
    values.put(KEY_TITLEAUDIO, a.getTitle_audio());
    values.put(KEY_DURATION, Integer.valueOf(a.getDuration()));
    values.put(KEY_SHORTDESC, a.getShortDesc());
    values.put(KEY_FULLDESC, a.getFullDesc());
    values.put(KEY_PHOTO, a.getPhoto());
    values.put(KEY_SANSKRITNAME, a.getSanskrit_name());
    values.put(KEY_SANSKRITAUDIOTITLE, a.getSanskrit_audio_title());
    values.put(KEY_BREATHINGVIDEO, a.getBreathing_video());
    values.put(KEY_ISBREATHING, Integer.valueOf(a.checkBool(a.getIs_breathing())));
    values.put(KEY_ISPAID, Integer.valueOf(a.checkBool(a.getIs_paid())));
    values.put(KEY_OLDIDENTIFIER, a.getName());
    values.put(KEY_OLDPK, a.getName());
    values.put(KEY_VIDEO, a.getVideo());
    if (checkById(TABLE_ASANAS, KEY_ID, a.getId())) {

        Log.d("LOGSASANA", " allready exist");

    } else {
        this.dbase.insert(TABLE_ASANAS, null, values);

        Log.d("LOGSASANA", a.getName() + " added");

    }


}
close();
}
public boolean checkById(String TableName, String dbfield, int id){
    Cursor cursor = this.dbase.rawQuery("SELECT * FROM " + TableName + " WHERE " + dbfield + " = " +  id , null);
    if (cursor.getCount() <= 0) {
        cursor.close();
        return false;
    }
    cursor.close();
    return true;

}

1 个答案:

答案 0 :(得分:2)

您所做的是调用端点异步并在主线程中处理繁重的数据库操作。 你可以使用单个AsyncTask在后台线程中完成所有这些工作。

将异步改造端点更改为同步,如:

void getPrograms(Callback<Programs>);

Programs myapi.getPrograms();

和单个异步任务,如:

public class MyHeavyTask extends AsyncTask<Void, Void, Void> {

    private final MYDBHelperFromApi DBHelperAPI;
    private final MYapi myapi;

    public MyHeavyTask(MYDBHelperFromApi DBHelperAPI, MYapi myapi) {
        this.DBHelperAPI = DBHelperAPI;
        this.myapi = myapi;
    }

    @Override
    protected Void doInBackground(Void... params) {
        HashMap<String, String> hashMap = myapi.getLanguages();
        boolean valid = hashMap != null;// do other validation catch exceptions if needed
        //Do response validation
        //Add to your database
        if (valid)
            DBHelperAPI.addLanguages(hashMap);

        //similarly
        List<AsanaLevel> asanaLevels = myapi.getLevelList();
        DBHelperAPI.addAsanaLevel(asanaLevels);

        List<AsanaType> asanaTypes = myapi.getTypeList();
        DBHelperAPI.addAsanaType(asanaTypes);

        List<ProgramGoal> programGoals = myapi.getProgramGoalList();
        DBHelperAPI.addProgramGoal(programGoals);

        //Similarly others

        return null;
    }
}

现在在onCreate方法中执行任务,如:

new MyHeavyTask(DBHelperAPI,myapi).execute();