java - 以特定时间间隔更改背景图像

标签 java android

我正在尝试开发一个背景每 5 秒更改一次的 android 应用程序,我编写了如下代码:

public class BgView extends Activity implements Runnable {
    ImageView img;
    int [] setImg = {R.drawable.one,R.drawable.two};
    RelativeLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bg_view);
        layout = (RelativeLayout) findViewById(R.id.first);
        Thread t = new Thread(new BigView);
            t.start();

    }

    @Override
    public void run() {
        for (int i = 0; i < 2; ++i) {
            layout.setBackgroundResource(setImg[i]);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

} 

它编译得很好,但是当我试图在模拟器中运行它时,它在 5 秒后停止,在 logcat 中我看到一个异常,它说我不能从其他函数或类似的东西触摸 Activity 类 View .

所以我将整个 for 循环 放在 onCreate() 方法中,现在我没有得到任何异常,但我看到的只是一个空白屏幕,持续 5 秒,然后我得到最后一张图像

我知道这个问题已被重复,但我只是不想复制粘贴代码...我想知道为什么会发生这种情况以及我们如何以最少的更改使其工作


编辑 : 我得到以下异常: E/AndroidRuntime(904): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建 View 层次结构的原始线程才能触及它的 View 。
我想知道为什么将整个 for 循环放在 onCreate() 方法中不起作用

最佳答案

只有 UI 线程可以/应该更新 UI View ,在您的代码中,您试图直接从新线程更新 View 。

您应该在您的 Activity 中创建一个处理程序,然后在需要的时间间隔从您的线程中调用它。然后处理程序应该更新 UI。试试代码(我没有编译代码,只是输入它所以可能有拼写错误/错误)

public class BgView extends Activity implements Runnable {
    ImageView img;
    final int [] setImg = {R.drawable.one,R.drawable.two};
    RelativeLayout layout;

    interface MyHandler {
     void letMeKnow(int i);
    }
    private MyHandler handler = new MyHandler(){

       @Override
       void letMeKnow(int i){
         layout.setBackgroundResource(setImg[i]);
       }
    }
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bg_view);
    layout = (RelativeLayout) findViewById(R.id.first);
    Thread t = new Thread(new BigView);
        t.start();

}

@Override
public void run() {
    for (int i = 0; i < 2; ++i) {
        handler.letMeKnow(i);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

} `

关于java - 以特定时间间隔更改背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435953/

相关文章:

java - 抑制自定义 FreeMarker 指令的所有空格和新行

java - Windows机器上无法通过VFS下载文件?

android - FusedLocationProviderApi.KEY_LOCATION_CHANGED 已弃用。现在要做什么?

java - Android:循环遍历字符串数组 - Intent 方法的逻辑需要帮助

android - MPAndroidChart 白色背景

java - Android 3g 下载和多线程

java - 使用带有 spring 的 import.sql 将图像存储为 byte[]

java - 从 Google Drive API v3 下载 Gdoc 修订版

java - 如何获取电子邮件 ID、显示名称和电话号码

Android:如何确定 View 的新大小