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

时间:2015-04-27 12:27:47

标签: android sqlite animation android-asynctask android-sqlite

我有edittext和按钮来插入数据,当我点击按钮时我隐藏按钮和edittext并显示ProgressBar。我正在使用AsyncTask在sqlite数据库中插入数据,但问题是,在执行后台任务时, ProgressBar不是动画。我正在使用带有intermediateDrawable的进度条。

注意: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并显示了其他小部件

这是我的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问题,在使用数据库时不允许progressBar进行Animate ...?

2 个答案:

答案 0 :(得分:0)

首先,您需要确保自定义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,如果自定义动画有效,它必须使用自定义动画 另外,请检查您是否正确运行AsyncTask,如new AsyncTask().execute()而不是new AsyncTask().doInBackground() 一般情况下:如果您的UI线程(Activity)忙于做某事(无论什么,它应该完全空闲),你根本不会看到任何PB动画。无论你做什么。
实际上你的问题是你使用runOnUiThread()在UI线程上启动AsyncTask的工作 - 你为什么这样做? AsyncTask那种方式毫无用处。

答案 1 :(得分:0)

您正在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));
}

}