【问题标题】:Progress Bar not animating while inserting data in Database using AsyncTask使用 AsyncTask 在数据库中插入数据时进度条没有动画
【发布时间】:2015-04-27 12:27:47
【问题描述】:

我有 edittext 和 button 来插入数据,当我单击按钮时,我隐藏了 button 和 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 中,我隐藏了进度条并显示其他小部件

这是我的 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 动画...?

【问题讨论】:

  • 也发布异步任务代码。
  • 发布从活动或任何你运行它的地方运行 asyncTask 代码。你有没有尝试过你的进度条动画?您可以使其可见并无需任何操作即可运行您的活动,因此它应该具有动画效果。
  • 既然你很了解AsyncTask,我假设你使用onProgressUpdate方法来制作进度条动画
  • 我根本没有使用任何动画方法来制作动画。我只是让它可见。这就是@Stan
  • 其实你使用的是自定义动画:android:indeterminateDrawable="@drawable/loader_0_1"。好的,然后让它在活动的onCreate() 中可见,看看它是否有动画。也可能整个 DB 作业执行得如此之快,以至于 PB 没有时间制作动画。 1-10 次插入执行得非常快。但是我建议你在循环内使用事务而不是你的 sql-inserts 方式。此外,您仍然没有展示如何实例化和运行 AsyncTask。

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


【解决方案1】:

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

}

【讨论】:

  • 兄弟,你的回答成就了我的人生。我从runOnUiThread 中删除了数据库代码,还从 onPostExecute 方法中删除了runOnUiThread,它起作用了。感谢您的努力,意义重大。已接受回答.
  • 嘿,很高兴它起作用了,虽然你的评论“我删除了数据库代码”让我有点困惑。您不应该删除数据库代码,只删除 runOnUiThread 的东西。我编辑了我的答案以显示它的外观。祝你好运:)
  • 是的,伙计,我就是这样做的。我从 doInBackground 和 postExecute 方法中删除了 runOnUiThread。你是绝对正确的
【解决方案2】:

首先,您需要确保自定义 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" />  

如果活动空闲,它应该动画(在 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() 一样正确运行 AsyncTask 而不是 new AsyncTask().doInBackground()
一般来说:如果您的 UI 线程 (Activity) 正忙于做某事(无论如何,它应该完全空闲),无论您做什么,您都不会看到任何 PB 动画。
实际上,您的问题是您使用 runOnUiThread() 在 UI 线程上启动 AsyncTask 的工作-您为什么要这样做? AsyncTask 那样是没用的。

【讨论】:

  • 我试过这样做。它工作得很好。当 AsyncTask 运行时,如果我在 AsyncTask 中调用 .NET Web 服务,它就会动画。但是当我在 AsyncTask 中使用 sqlite 时,pb 没有动画。\
  • 您也尝试过标准圆形 PB 吗?还可以尝试使用任何其他作业加载 AsyncTask,甚至只是 Thread.sleep(7000); 以使 AsyncTaks 的线程休眠 7 秒,然后看看会发生什么。
  • 感谢您的努力@Stan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多