使用线程更改ImageView中的图像

3
我用这段代码出现了错误,为什么呢?huhu 123123123
Thread timer = new Thread()
{
    public void run()
    {
        try
        {
            sleep(1500);
            splash.setImgeResource(R.drawable.dilclogo);
            sleep(1500);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        finally
        {
            Intent intent = new Intent(MainActivity.this, MenuScreen.class);
            startActivity(intent);
        }
    }
};
timer.start();

1
使用Activty.runonuithread可以从非UI线程更改UI元素,您也可以使用handler.postdelayed来代替Thread执行相同的操作。 - ρяσѕρєя K
加油,需要一些描述。 - Android Killer
如果你使用AsyncTask来实现这个功能,会更加容易。 - Krylez
你得到答案了吗?如果没有,那就看看我的答案。 - Hemantvc
6个回答

3
这是因为您无法直接从任何其他线程访问UI /主线程。但您可以使用以下方法访问您的UI线程:
  1. 使用AsyncTask
  2. 使用runOnUiThread()
您还可以阅读文章,以帮助您更好地理解此概念。

2
将 "splash.setImgeResource(R.drawable.dilclogo);" 放入 "runOnUiThread" 中。
Thread timer = new Thread()
            {
                public void run()
                {
                    try
                    {
                        sleep(2000);
                       runOnUiThread(new Runnable() {
                        public void run() {
                             splash.setImageResource(R.drawable.billboard_image);
                        }
                    });

                        sleep(2000);
                        runOnUiThread(new Runnable() {
                            public void run() {
                                 splash.setImageResource(R.drawable.square);
                            }
                        });
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    finally
                    {
                       System.out.println("finally");
                    }
                }
            };
            timer.start();

2

你应该在UI线程上更新UI。使用runOnUiThread。

  runOnUiThread(new Runnable() {

  @Override
  public void run() {
   // set image to imageview here
   // ui should be updated on the ui thread.
   // you cannot update ui from a background thread  
  }
 });

但我建议您使用一个处理程序。

public class Splash extends Activity {

//stopping splash screen starting home activity.
private static final int STOPSPLASH = 0;
//time duration in millisecond for which your splash screen should visible to
  //user. here i have taken half second
private static final long SPLASHTIME = 500;

//handler for splash screen
private Handler splashHandler = new Handler() {
     @Override
     public void handleMessage(Message msg) {
          switch (msg.what) {
            case STOPSPLASH:
                //Generating and Starting new intent on splash time out 
                Intent intent = new Intent(Splash.this, 
                                         MainActivity.class);
                startActivity(intent);
                    Splash.this.finish(); 
                break;
          }
          super.handleMessage(msg);
     }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);

    //Generating message and sending it to splash handle 
    Message msg = new Message();
    msg.what = STOPSPLASH;
    splashHandler.sendMessageDelayed(msg, SPLASHTIME);
}
}

splash.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:background="@drawable/mydrawable">
     // have a imageview and set background to imageview   

</RelativeLayout>

使用处理程序和postdelayed

public class Splash extends Activity {
private static final int SPLASH_TIME = 2 * 1000;// 3 seconds

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ImageView iv= (ImageView) findViewById(R.id.imageView1);
    iv.setBackgroundResource(R.drawable.afor);
    try {
    new Handler().postDelayed(new Runnable() {

        public void run() {

            Intent intent = new Intent(Splash.this,
                MainActivity.class);
            startActivity(intent);

            Splash.this.finish();
        }


    }, SPLASH_TIME);

    } catch(Exception e)
       {
        e.printStacktrace();
       }
}


@Override
public void onBackPressed() {
    this.finish();
    super.onBackPressed();
}
}

splash.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:background="#ffffaa">

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
     />

</RelativeLayout>

1

你不能在Android系统上使用普通的线程。

以下是一些在Android系统中线程的例子:D

---> Android Asynctask

Android Developer - Android Asynctask

你可以在Android UI界面上使用它来实现一些加载效果。

---> runOnUiThread

在你的情况下,我建议使用这个。 你可以在这里找到更多详细信息。

点击查看详情

用法:

runOnUiThread(new Runnable() {

  @Override
  public void run() {
    // Do you ui update here
  }

});

0

也许考虑使用

AsyncTask.execute(new Runnable {
  public void run() {
     splash.setImageResource(R.drawable.square);
  }
});

0
public class vv extends Activity {
    int b[] = {R.drawable.a, R.drawable.m, R.drawable.b, R.drawable.j, R.drawable.er, R.drawable.chan, R.drawable.vv};
    public ImageView i;
    int z = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        i = (ImageView) findViewById(R.id.image);
        i.setImageResource(b[0]);
        Thread timer = new Thread() {
            public void run() {
                try {
                    sleep(2000);

                    for (z = 0; z < b.length + 2; z++) {
                        if (z < b.length) {
                            sleep(2000);
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    i.setImageResource(b[z]);
                                }
                            });
                        } else {
                            z = 0;

                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println("finally");
                }
            }
        };
        timer.start();
    }


}

它正在运行一个无限循环,以便在特定时间限制内更改b[]中的不同图像。由于j的值会自动增加,因此i.setImageResource(b[z]);会更改图像。 - virendra singh deora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接