在SQLite android应用程序中插入数据是挂起的
当我通过主屏幕上的后台进程在SQLite中插入数据时,应用程序被挂起。我不能按任何按钮。在SQLite中成功插入数据后,应用程序工作正常。那个么,在SQLite中插入数据时,有什么方法可以让我轻松地点击按钮吗?[我不想以静默方式显示进度对话框和在db中插入数据]在SQLite android应用程序中插入数据是挂起的,android,sqlite,android-sqlite,sqliteopenhelper,Android,Sqlite,Android Sqlite,Sqliteopenhelper,当我通过主屏幕上的后台进程在SQLite中插入数据时,应用程序被挂起。我不能按任何按钮。在SQLite中成功插入数据后,应用程序工作正常。那个么,在SQLite中插入数据时,有什么方法可以让我轻松地点击按钮吗?[我不想以静默方式显示进度对话框和在db中插入数据] public void Auth(final SignIn mSignIn, final String fbId, final String msgId) { CustomRequest jsonObjectRequest =
public void Auth(final SignIn mSignIn, final String fbId, final String msgId) {
CustomRequest jsonObjectRequest = new CustomRequest(Request.Method.POST, General.LOGIN, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.e(LOGTAG, "SignIn Response - " + jsonObject.toString());
try {
JSONObject jData = jsonObject.getJSONObject(General.DATA);
String status = jData.getString(General.STATUSCODE);
if (status.equalsIgnoreCase("1")) {
// success
dbHelper = new DbHelper(activity);
if (dbHelper.dbIsOpen()) {
} else {
dbHelper.open();
}
authHandleFetchAuthFriendResponse(jData.getJSONObject(General.FRIENDLIST));
dbHelper.close();
}
} catch (IllegalStateException e) {
e.printStackTrace();
dbHelper.close();
} catch (Exception e) {
Log.e(LOGTAG, "SignIn Response Exception - " + jsonObject.toString());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(LOGTAG, "SignIn Error : " + volleyError.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("deviceMake", General.DEVICEMAKE);
params.put("deviceId", GiftAMeal.getInstance().getDeviceId());
params.put("deviceToken", GiftAMeal.getInstance().getDeviceToken());
params.put("userName", GiftAMeal.getInstance().getUserName());
params.put("password", GiftAMeal.getInstance().getPassword());
return params;
}
};
像这样使用AsyncTask
class InsertDataAsync extends AsyncTask<Void, Void, Long> {
ProgressDialog progressDialog;
Data.Friend fri;
InsertDataAsync(Data.Friend fri) {
this.fri = fri;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage("Please wait...");
progressDialog.show();
}
@Override
protected Long doInBackground(Void... voids) {
try {
return createGiftAMealFriendlistNew(fri);
} catch (Exception e) {
e.printStackTrace();
}
return 0L;
}
@Override
protected void onPostExecute(Long id) {
super.onPostExecute(id);
progressDialog.dismiss();
if (id > 0) {
//data insert success
} else {
//some error occurred
}
}
}
new InsertDataAsync(fri).execute();
其中fri是数据。朋友参考
希望这对您有所帮助。显示您的代码。快速解决方案-您必须在主线程上处理。改为使用工作线程。只需在后台执行SQLITE。使用rectiveX android在后台执行。使用异步任务代替写入磁盘需要几百毫秒。这可以在后台发生,无需阻塞对话框,而无需冻结-用户不关心您如何或何时执行操作,他们希望使用应用程序。与其使用异步任务,不如使用Rx在工作线程中执行任务
class InsertDataAsync extends AsyncTask<Void, Void, Long> {
ProgressDialog progressDialog;
Data.Friend fri;
InsertDataAsync(Data.Friend fri) {
this.fri = fri;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage("Please wait...");
progressDialog.show();
}
@Override
protected Long doInBackground(Void... voids) {
try {
return createGiftAMealFriendlistNew(fri);
} catch (Exception e) {
e.printStackTrace();
}
return 0L;
}
@Override
protected void onPostExecute(Long id) {
super.onPostExecute(id);
progressDialog.dismiss();
if (id > 0) {
//data insert success
} else {
//some error occurred
}
}
}
new InsertDataAsync(fri).execute();