使用 AsyncTask 在数据库中插入数据时进度条没有动画
Progress Bar not animating while inserting data in Database using AsyncTask
我有 edittext 和按钮来插入数据,当我单击按钮时,我隐藏了按钮和 edittext 并显示 ProgressBar.I 我正在使用 AsyncTask 在 sqlite 数据库中插入数据,但问题是,虽然执行后台任务,ProgressBar 不是 animating.I 我正在使用带有 intermediateDrawable 的 progressbar。
注意:ProgressBar 在其他 类 中完美地动画化,但是当我在数据库中插入数据时,它显示但不是动画化。
进度条
<ProgressBar
android:id="@+id/pb"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/viewSpace3"
android:indeterminateDrawable="@drawable/loader_0_1" />
loader_0_1.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
<shape
android:innerRadiusRatio="3"
android:shape="oval"
android:thicknessRatio="8"
android:useLevel="false" >
<size
android:height="48dip"
android:width="48dip" />
<gradient
android:centerColor="#FFFFFF"
android:centerY="0.50"
android:endColor="#0B95B9"
android:startColor="#FFFFFF"
android:type="sweep"
android:useLevel="false" />
</shape>
在 AsyncTask 的 preExecute 中,我隐藏了其他小部件并显示了 progressBar pb,使用
在 doInBackground 中,我使用游标在数据库中插入数据
在 PostExecute 中,我隐藏了进度条并显示了其他小部件
这是我的 AsyncTask 方法
private class SaveToDatabase extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
runOnUiThread(new Runnable() {
@Override
public void run() {
sLayout.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
}
});
}
@Override
protected String doInBackground(String... params) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
mdb=new DBHandler(CustomCVG.this, DATABASE_NAME,null, DATABASE_VERSION);
db=mdb.getWritableDatabase();
db=mdb.getWritableDatabase();
for (int i = 0; i < adapter.getCount(); i++) {
ContentValues cv=new ContentValues();
cv.put("VIN", vin_z);
cv.put("rotate", rotateStringList.get(i));
db.insert("imageUploadDb", null, cv);
}
db.close();
startActivity(new Intent(getApplicationContext(), MGTActivity.class));
}
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
sLayout.setVisibility(View.VISIBLE);
}
});
}
}
是否是内存或 RAM 问题导致进度条在使用数据库时无法设置动画...?
1st 您需要确保您的自定义 ProgressBar 动画 (loader_0_1.xml) 完全有效。为此,您应该在 activity 的布局中添加可见的 ProgressBar:
<ProgressBar
android:id="@+id/pb"
android:visibility="visible"
android:layout_centerInParent="true"
android:layout_width="100dp"
android:layout_height="100dp"
android:indeterminateDrawable="@drawable/loader_0_1" />
如果 activity 处于空闲状态(在 UI htread 上不执行任何操作),它应该设置动画。如果它没有动画,你应该首先修复动画。
尝试添加标准(非定制)圆形 PB,如:
<ProgressBar
android:id="@+id/standard_round_pb"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
并查看它是否如前所述将动画(旋转)添加到 activity 中。然后检查它是否在您的 AsyncTask 处于 运行ning 时进行动画处理。如果它与标准 PB 一起使用,则如果自定义动画可以工作,则必须与您的自定义动画一起使用。
还要检查你 运行 你的 AsyncTask 是否正确地喜欢 new AsyncTask().execute()
而不是 new AsyncTask().doInBackground()
.
一般来说:如果你的UI线程(Activity)正在忙着做某事(无论如何,它应该完全空闲)你根本看不到任何PB动画,无论你做什么。
实际上,您的问题是您使用 runOnUiThread()
在 UI 线程上启动 AsyncTask 的工作 - 为什么要这样做? AsyncTask 那种方式没用。
您正在 运行 在 UI 线程上进行后台操作。你还有什么看法
runOnUiThread(new Runnable() {
....
}
是吗? OnPreExecute 和 OnPostExecute 已经在 UI 线程上 运行,所以你在那里不需要它。 doInBackground 运行s 在另一个线程上,但是你再次在 UI 线程上强制它 运行 ......所以 UI 线程正忙并且无法显示也就不足为奇了你的进度条。
它应该是这样的:
private class SaveToDatabase extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
sLayout.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... params) {
mdb=new DBHandler(CustomCVG.this, DATABASE_NAME,null, DATABASE_VERSION);
db=mdb.getWritableDatabase();
db=mdb.getWritableDatabase();
for (int i = 0; i < adapter.getCount(); i++) {
ContentValues cv=new ContentValues();
cv.put("VIN", vin_z);
cv.put("rotate", rotateStringList.get(i));
db.insert("imageUploadDb", null, cv);
}
db.close();
return null;
}
@Override
protected void onPostExecute(String result) {
pb.setVisibility(View.GONE);
sLayout.setVisibility(View.VISIBLE);
startActivity(new Intent(getApplicationContext(), MGTActivity.class));
}
}
我有 edittext 和按钮来插入数据,当我单击按钮时,我隐藏了按钮和 edittext 并显示 ProgressBar.I 我正在使用 AsyncTask 在 sqlite 数据库中插入数据,但问题是,虽然执行后台任务,ProgressBar 不是 animating.I 我正在使用带有 intermediateDrawable 的 progressbar。
注意:ProgressBar 在其他 类 中完美地动画化,但是当我在数据库中插入数据时,它显示但不是动画化。
进度条
<ProgressBar
android:id="@+id/pb"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/viewSpace3"
android:indeterminateDrawable="@drawable/loader_0_1" />
loader_0_1.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
<shape
android:innerRadiusRatio="3"
android:shape="oval"
android:thicknessRatio="8"
android:useLevel="false" >
<size
android:height="48dip"
android:width="48dip" />
<gradient
android:centerColor="#FFFFFF"
android:centerY="0.50"
android:endColor="#0B95B9"
android:startColor="#FFFFFF"
android:type="sweep"
android:useLevel="false" />
</shape>
在 AsyncTask 的 preExecute 中,我隐藏了其他小部件并显示了 progressBar pb,使用
在 doInBackground 中,我使用游标在数据库中插入数据
在 PostExecute 中,我隐藏了进度条并显示了其他小部件
这是我的 AsyncTask 方法
private class SaveToDatabase extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
runOnUiThread(new Runnable() {
@Override
public void run() {
sLayout.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
}
});
}
@Override
protected String doInBackground(String... params) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
mdb=new DBHandler(CustomCVG.this, DATABASE_NAME,null, DATABASE_VERSION);
db=mdb.getWritableDatabase();
db=mdb.getWritableDatabase();
for (int i = 0; i < adapter.getCount(); i++) {
ContentValues cv=new ContentValues();
cv.put("VIN", vin_z);
cv.put("rotate", rotateStringList.get(i));
db.insert("imageUploadDb", null, cv);
}
db.close();
startActivity(new Intent(getApplicationContext(), MGTActivity.class));
}
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
runOnUiThread(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
sLayout.setVisibility(View.VISIBLE);
}
});
}
}
是否是内存或 RAM 问题导致进度条在使用数据库时无法设置动画...?
1st 您需要确保您的自定义 ProgressBar 动画 (loader_0_1.xml) 完全有效。为此,您应该在 activity 的布局中添加可见的 ProgressBar:
<ProgressBar
android:id="@+id/pb"
android:visibility="visible"
android:layout_centerInParent="true"
android:layout_width="100dp"
android:layout_height="100dp"
android:indeterminateDrawable="@drawable/loader_0_1" />
如果 activity 处于空闲状态(在 UI htread 上不执行任何操作),它应该设置动画。如果它没有动画,你应该首先修复动画。
尝试添加标准(非定制)圆形 PB,如:
<ProgressBar
android:id="@+id/standard_round_pb"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
并查看它是否如前所述将动画(旋转)添加到 activity 中。然后检查它是否在您的 AsyncTask 处于 运行ning 时进行动画处理。如果它与标准 PB 一起使用,则如果自定义动画可以工作,则必须与您的自定义动画一起使用。
还要检查你 运行 你的 AsyncTask 是否正确地喜欢 new AsyncTask().execute()
而不是 new AsyncTask().doInBackground()
.
一般来说:如果你的UI线程(Activity)正在忙着做某事(无论如何,它应该完全空闲)你根本看不到任何PB动画,无论你做什么。
实际上,您的问题是您使用 runOnUiThread()
在 UI 线程上启动 AsyncTask 的工作 - 为什么要这样做? AsyncTask 那种方式没用。
您正在 运行 在 UI 线程上进行后台操作。你还有什么看法
runOnUiThread(new Runnable() {
....
}
是吗? OnPreExecute 和 OnPostExecute 已经在 UI 线程上 运行,所以你在那里不需要它。 doInBackground 运行s 在另一个线程上,但是你再次在 UI 线程上强制它 运行 ......所以 UI 线程正忙并且无法显示也就不足为奇了你的进度条。
它应该是这样的:
private class SaveToDatabase extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
sLayout.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... params) {
mdb=new DBHandler(CustomCVG.this, DATABASE_NAME,null, DATABASE_VERSION);
db=mdb.getWritableDatabase();
db=mdb.getWritableDatabase();
for (int i = 0; i < adapter.getCount(); i++) {
ContentValues cv=new ContentValues();
cv.put("VIN", vin_z);
cv.put("rotate", rotateStringList.get(i));
db.insert("imageUploadDb", null, cv);
}
db.close();
return null;
}
@Override
protected void onPostExecute(String result) {
pb.setVisibility(View.GONE);
sLayout.setVisibility(View.VISIBLE);
startActivity(new Intent(getApplicationContext(), MGTActivity.class));
}
}