在 SQLite 上存储 1000 多个数据导致 UI 挂起
Storing 1000+ data on SQLite resulting UI Hang
我需要根据我们服务器的响应在 SQLiteDatabase
上插入大数据。但直到现在我仍然对 AsyncTask()
感到困惑,我想对此进行一些澄清。这是我使用 AsyncTask()
的完整代码。我将 AndroidNetworking
库用于 HTTP 请求
class ProgressAsync extends AsyncTask<String, String, Boolean> {
boolean result = false;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
loadingDialog = new LoadingDialog();
//dialogLoading.setTargetFragment(this, 1);
FragmentManager fragmentManager = getSupportFragmentManager();
loadingDialog.show(fragmentManager, "Dialog_Loading");
}
});
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try
JSONObject JSONparams = new JSONObject();
try {
JSONparams.put("a", "1");
JSONparams.put("b", "1");
JSONparams.put("c", "1");
JSONparams.put("d", "1");
} catch (Throwable e) {
e.printStackTrace();
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();
AndroidNetworking.initialize(getApplicationContext(), okHttpClient);
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
MainActivity.appDatabase.dao2().insertAllkm(kmpost);
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
result = true;
Log.e("Status", String.valueOf(a));
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
a = false;
}
});
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
Log.e("Logsssssssssss", "LOgssssssssss");
Thread thread = new Thread() {
@Override
public void run() {
try {
while (!result) {
//Thread.sleep(1000);
}
loadingDialog.dismiss();
}catch (Throwable e){
e.printStackTrace();
}
}
};
thread.start();
}
}
问题1:为什么onPostExecute()
上的登录先显示,而doInBackground()
上的登录还没有完成?我该如何解决这个问题?
问题 2:while()
循环真的有用吗?或者它只是一个创可贴解决方案?
问题三:ProgressDialog
加载动画时如何避免lag/hang?
这样改代码怎么样
//showDialog
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
//MainActivity.appDatabase.dao2().insertAllkm(kmpost);
//Fire AsyncTask to Save to dao() and onPostThat Task hide the progressBar
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
result = true;
Log.e("Status", String.valueOf(a));
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
a = false;
}
});
我解决 it.I 认为在 SQLiteDatabase
中插入数据是造成 UI 滞后的原因。由于 AndroidNetworking
使用单独的 Thread
并使 onPostExecute()
先运行而无需等待 runInBackground()
,因此我想出了一个解决方案,将数据插入分离到一个新的 Thread()
。它有效:)。
完整代码:
class ProgressAsync extends AsyncTask<String, String, Boolean> {
boolean result = false;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
loadingDialog = new LoadingDialog();
//dialogLoading.setTargetFragment(this, 1);
FragmentManager fragmentManager = getSupportFragmentManager();
loadingDialog.show(fragmentManager, "Dialog_Loading");
}
});
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try
JSONObject JSONparams = new JSONObject();
try {
JSONparams.put("a", "1");
JSONparams.put("b", "1");
JSONparams.put("c", "1");
JSONparams.put("d", "1");
} catch (Throwable e) {
e.printStackTrace();
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();
AndroidNetworking.initialize(getApplicationContext(), okHttpClient);
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
MainActivity.appDatabase.dao2().insertAllkm(kmpost);
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
//adding the code for dismiss dialog
loadingDialog.dismiss();
}
}).start();
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
}
});
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}
我需要根据我们服务器的响应在 SQLiteDatabase
上插入大数据。但直到现在我仍然对 AsyncTask()
感到困惑,我想对此进行一些澄清。这是我使用 AsyncTask()
的完整代码。我将 AndroidNetworking
库用于 HTTP 请求
class ProgressAsync extends AsyncTask<String, String, Boolean> {
boolean result = false;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
loadingDialog = new LoadingDialog();
//dialogLoading.setTargetFragment(this, 1);
FragmentManager fragmentManager = getSupportFragmentManager();
loadingDialog.show(fragmentManager, "Dialog_Loading");
}
});
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try
JSONObject JSONparams = new JSONObject();
try {
JSONparams.put("a", "1");
JSONparams.put("b", "1");
JSONparams.put("c", "1");
JSONparams.put("d", "1");
} catch (Throwable e) {
e.printStackTrace();
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();
AndroidNetworking.initialize(getApplicationContext(), okHttpClient);
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
MainActivity.appDatabase.dao2().insertAllkm(kmpost);
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
result = true;
Log.e("Status", String.valueOf(a));
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
a = false;
}
});
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
Log.e("Logsssssssssss", "LOgssssssssss");
Thread thread = new Thread() {
@Override
public void run() {
try {
while (!result) {
//Thread.sleep(1000);
}
loadingDialog.dismiss();
}catch (Throwable e){
e.printStackTrace();
}
}
};
thread.start();
}
}
问题1:为什么onPostExecute()
上的登录先显示,而doInBackground()
上的登录还没有完成?我该如何解决这个问题?
问题 2:while()
循环真的有用吗?或者它只是一个创可贴解决方案?
问题三:ProgressDialog
加载动画时如何避免lag/hang?
这样改代码怎么样
//showDialog
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
//MainActivity.appDatabase.dao2().insertAllkm(kmpost);
//Fire AsyncTask to Save to dao() and onPostThat Task hide the progressBar
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
result = true;
Log.e("Status", String.valueOf(a));
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
a = false;
}
});
我解决 it.I 认为在 SQLiteDatabase
中插入数据是造成 UI 滞后的原因。由于 AndroidNetworking
使用单独的 Thread
并使 onPostExecute()
先运行而无需等待 runInBackground()
,因此我想出了一个解决方案,将数据插入分离到一个新的 Thread()
。它有效:)。
完整代码:
class ProgressAsync extends AsyncTask<String, String, Boolean> {
boolean result = false;
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
loadingDialog = new LoadingDialog();
//dialogLoading.setTargetFragment(this, 1);
FragmentManager fragmentManager = getSupportFragmentManager();
loadingDialog.show(fragmentManager, "Dialog_Loading");
}
});
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try
JSONObject JSONparams = new JSONObject();
try {
JSONparams.put("a", "1");
JSONparams.put("b", "1");
JSONparams.put("c", "1");
JSONparams.put("d", "1");
} catch (Throwable e) {
e.printStackTrace();
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();
AndroidNetworking.initialize(getApplicationContext(), okHttpClient);
AndroidNetworking.get(url)
.setPriority(Priority.HIGH).build()
.getAsJSONArray(new JSONArrayRequestListener() {
@Override
public void onResponse(JSONArray response) {
Log.e("Response", String.valueOf(response));
try {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < response.length(); i++) {
JSONObject objUsers = response.getJSONObject(i);
final String user_id = objUsers.getString("id");
final String issued_company_id = objUsers.getString("subcompany_id");
final String position = objUsers.getString("route_id");
final String card_id = objUsers.getString("route_name");
KMpost kmpost = new KMpost();
kmpost.setId(user_id);
kmpost.setSubcompany_id(issued_company_id);
kmpost.setRoute_id(position);
kmpost.setRoute_name(card_id);
MainActivity.appDatabase.dao2().insertAllkm(kmpost);
}
if (MainActivity.appDatabase.isOpen()){
MainActivity.appDatabase.close();
}
//adding the code for dismiss dialog
loadingDialog.dismiss();
}
}).start();
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onError(ANError anError) {
Log.e("anError", String.valueOf(anError.getErrorCode()));
}
});
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}