使用AsyncTask在数据库中插入数据时,进度条未设置动画



我有edittext和按钮来插入数据,当我点击按钮时,我会隐藏按钮和edittext并显示ProgressBar。我使用AsyncTask在sqlite数据库中插入数据,但问题是,在执行后台任务时,ProgressBar没有动画。我正在使用带有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中,我隐藏progressBar并显示其他小部件

这是我的异步任务方法

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问题,不允许progressBar在处理数据库时制作动画吗。。。?

您正在UI线程上运行后台操作。你认为还有什么

runOnUiThread(new Runnable() {
....
}

是吗?OnPreExecute和OnPostExecute已经在UI线程上运行,所以您不需要它。doInBackground在另一个线程上运行,但您强制它再次在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));
}

}

首先,您需要确保自定义ProgressBar动画(loader_0_1.xml)能够正常工作。要做到这一点,您应该在活动布局中添加可见的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" />  

如果活动处于空闲状态(在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" />

并查看它是否如前所述为添加到活动中的活动设置动画(旋转)。然后检查它是否在运行AsyncTask时设置动画。如果使用标准PB,则如果自定义动画可以工作,则必须使用自定义动画
还要检查您是否像new AsyncTask().execute()new AsyncTask().doInBackground()一样正确运行AsyncTask
一般来说:如果你的UI线程(活动)忙于做一些事情(不管怎样,它都应该完全空闲),无论你做什么,你都看不到任何PB动画。
实际上,你的问题是你在UI线程上使用runOnUiThread()启动AsyncTask的作业-你为什么这么做?AsyncTask那样做毫无用处。

最新更新