我使用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;
}
答案 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();