使用线程更改imageview中的图像

时间:2013-05-20 05:34:29

标签: android multithreading

我的代码出错了。为何胡胡 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();

6 个答案:

答案 0 :(得分:3)

这是因为您无法直接从任何其他线程访问您的UI /主线程。您可以使用以下方法访问您的UI线程:

  1. 使用AsyncTask
  2. 使用runOnUiThread()
  3. 您还可以阅读有关在线程中的线程的this文章,以帮助您更好地理解这一概念。

答案 1 :(得分:2)

put splash.setImgeResource(R.drawable.dilclogo); line into 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 :(得分:1)

你不能在android系统上使用普通线程。 给你一些关于android上的线程的例子:D

---> Android Asynctask

Android Developer - Android Asynctask

您可以将此用于Android中的UI上的一些加载效果。

---> runOnUiThread

在你的情况下,我建议使用它。 您可以在此处获得更多详细信息。

Click for detail

使用率::

runOnUiThread(new Runnable() {

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

});

答案 3 :(得分:1)

你应该在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>

使用处理程序和后延迟

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>

答案 4 :(得分: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();
    }


}

答案 5 :(得分:0)

也许考虑使用

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