在AsyncTask

时间:2015-09-01 18:47:46

标签: android animation android-asynctask progressdialog

我创建了一个自定义的ProgressDialog,它有一个生动的ImageView。但这给出了在AsyncTask执行中使用的错误。 AsyncTask失业了。我尝试使用runOnUiThread动画而不起作用。如何在运行AsyncTask时使用此动画?

layout_progress.xml(仅图片)

<ImageView
    android:id="@+id/ivLoading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@anim/loading"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="100dp"/>

loading.xml(动画)

<?xml version="1.0" encoding="utf-8"?>
<animation-list android:id="@+id/animation" android:oneshot="false"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/load5_1" android:duration="150" />
    <item android:drawable="@drawable/load5_2" android:duration="150" />
    <item android:drawable="@drawable/load5_3" android:duration="150" />
    <item android:drawable="@drawable/load5_4" android:duration="150" />
    <item android:drawable="@drawable/load5_5" android:duration="150" />
    <item android:drawable="@drawable/load5_6" android:duration="150" />
    <item android:drawable="@drawable/load5_7" android:duration="150" />
    <item android:drawable="@drawable/load5_8" android:duration="150" />
    <item android:drawable="@drawable/load5_9" android:duration="150" />
    <item android:drawable="@drawable/load5_10" android:duration="150" />
</animation-list>

自定义进度对话框的方法显示

    public void show() {
        super.show();
        setContentView(layoutId);

        final ImageView imageView = (ImageView) findViewById(R.id.ivLoading);

        final AnimationDrawable anim = (AnimationDrawable) imageView.getDrawable();

        final Runnable run = new Runnable() {


@Override
        public void run() {
            anim.start();
        }
    };

    imageView.post(run);

    //test 2 - doesnt work
    /*
    final Runnable run = new Runnable() {
        @Override
        public void run() {
            anim.start();

            imageView.post(this);
        }
    };

    activity.runOnUiThread(run);

    */
}

1 个答案:

答案 0 :(得分:0)

您不应该在AsyncTask中执行此操作。 UI的操作只能在UI线程中完成。

有一个简单的例子说明你想要在这里实现的目标: http://developer.android.com/guide/topics/graphics/drawable-animation.html

在确定ImageView已附加到视图层次结构后,尝试并启动动画。引用我发布的链接:

  

重要的是要注意,在Activity的onCreate()方法中,无法调用在AnimationDrawable上调用的start()方法,因为AnimationDrawable尚未完全附加到窗口。如果你想立即播放动画而不需要交互,那么你可能想从你的Activity中的onWindowFocusChanged()方法调用它,当Android让你的窗口成为焦点时会调用它。