如何使用AsyncTask以设定的间隔将多个图像逐个加载到ImageView?

时间:2017-05-15 00:37:36

标签: android android-asynctask

当我点击一个按钮时,我尝试做一个幻灯片放映,ImageView将一次一个接一个地显示所有图片/可从Integer pics []中绘制,我将从radiobuttons中选择一个设定的间隔速度(屏幕上有3个选项。

我尝试在没有AsyncTask的情况下一次显示一个一个图像,但是它只显示最后一个图像,并且每个图片之间没有时间延迟。

for (Integer p:pics)
{
    iv.SetImageResource(p);
    SystemClock.sleep(500);
}

以下代码是我到目前为止,我需要帮助在AsyncTask的底部,如何在设定的间隔时间逐个实现图像

public class PhotoAlbum extends Activity
{   
    static final int intSlow = 3000;
    static final int intMed = 1000;
    static final int intFast = 500;

    ImageView iv;
    int interval;
    Integer pics[] = {
        R.drawable.img1,
        R.drawable.img2,
        R.drawable.img3,
        R.drawable.img4,
        R.drawable.img5,
        R.drawable.img6
    };

    RadioButton rbSlow;
    RadioButton rbMedium;
    RadioButton rbFast;
    Button mAutoButton;

    private int currentImage = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photo_album);

        iv = (ImageView) findViewById(R.id.imageView);
        iv.setImageResource(pics[currentImage]);

        rbSlow = (RadioButton) findViewById(R.id.radioSlow);
        rbMedium = (RadioButton) findViewById(R.id.radioMedium);
        rbFast = (RadioButton) findViewById(R.id.radioFast);

        mAutoButton = (Button) findViewById(R.id.buttonAuto);

        mAutoButton.setOnClickListener(AutoButtonChangeImageListener);

    }
    private View.OnClickListener AutoButtonChangeImageListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            AutoPicsTask.execute();
        }
    };

    private class AutoPicsTask extends AsyncTask<Integer, Void, Integer>
    {
        if (rbSlow.isChecked())
        {
            interval = intSlow;
        } else if (rbMedium.isChecked())
        {
            interval = intMed;
        } else
        {
            interval = intFast;
        }

        @Override
        protected Integer doInBackground(Integer... params)
        {
            for (Integer p : pics)
            {
                SystemClock.sleep(interval);
            }
            return null;
        }

        protected void onPostExecute(Integer ...value) {
            iv.setImageResource(value[0]);
        }
    }
}

抱歉,我是AsyncTask的新手。

这是一项使用我们迄今为止学到的内容的作业。 我们还没有学习如何使用“handler”,timer,runOnUiThread(),创建一个线程,void run(),postDelayed(),animate,我看到一些建议用于一次实现一个图像的帖子。

提前感谢。

2 个答案:

答案 0 :(得分:0)

您正在onPostExecute中设置图片资源。您必须在SystemClock.sleep(interval)之后或之前执行此操作。在doInBackground()中,您无法更改UI元素,但当然有解决方案。

使用runInUiThread()方法。它需要一个可运行的对象。在其中设置imageView。

for (Integer p : pics){
            SystemClock.sleep(interval);
            runOnUiThread(new Runnable(){
            @Override
                public void run() {
                    iv.setImageResource(p);
                }
            } );
}

答案 1 :(得分:0)

我使用此代码作为计时器

    CountDownTimer timer = new CountDownTimer(6000, 1000) { //this will make 5 minute delay

        @Override
        public void onTick(long millisUntilFinished) {

            // write the code of changing pictures
        }

        @Override
        public void onFinish() {
            try{

                //write the code when finishing
            }catch(Exception e){

            }
        }
    }.start();