Java 在Android中使用线程时出错

Java 在Android中使用线程时出错,java,android,multithreading,Java,Android,Multithreading,这是我的密码 I create a simple Project to load all images in drawable anh这里是获取所有ID的GetAllResourceId函数 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); list = (ImageView)findV

这是我的密码

I create a simple Project to load all images in drawable
anh这里是获取所有ID的GetAllResourceId函数

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    list = (ImageView)findViewById(R.id.tung);
    ct = getApplicationContext();
    try
    {
        IDs = getAllResourceIDs(R.drawable.class);
        n= IDs.length;
        dem=0;
        list.setOnClickListener(new View.OnClickListener()
         {
            public void onClick(View v)
            {
                ++dem;
                list.setImageResource(IDs[dem]);
                if(dem==n-1)
                    dem=0;
            }
        });

        Thread x = new Thread(
                new Runnable ()
                {
                    public void run()
                    {
                        while(true)
                        {
                            try
                            {
                                ++dem;
                                //Toast.makeText(ct, ""+dem, 20).show();
                                list.setImageResource(IDs[dem]);
                                if(dem==n-1)
                                    dem=0;
                            }
                            catch(Exception e)
                            {
                                //Toast.makeText(ct,e.toString(), 200).show();
                            }
                        }
                    }
                }
                );
        x.start();
    }
    catch(Exception e)
    {
        Toast.makeText(this,e.toString(), 200).show();
    }
}
private int[]GetAllResourceId(类aClass)引发IllegalArgumentException{
/*获取传递的类中的所有字段*/
字段[]IDFields=aClass.getFields();
/*能够存储所有ID的int数组*/
int[]IDs=新的int[IDFields.length];
试一试{
/*循环遍历所有字段并将id存储到数组*/
for(int i=0;i
文件main.xml只有一个id=“tung”的ImageView 我尝试使用名为x的Thead加载所有图像 通过使用代码 list.setImageResource(IDs[dem]); 正如您在我的代码中所看到的 但事情并没有发生
你能给我解释一下吗!非常感谢!

对于初学者来说,catch(异常e)
几乎从来都不是一个好主意,因为它隐藏了发生错误时可以获得的所有有意义的信息

您的错误尤其出现在后台线程的这一行:

private int[] getAllResourceIDs(Class<?> aClass) throws IllegalArgumentException{
    /* Get all Fields from the class passed. */
    Field[] IDFields = aClass.getFields();

    /* int-Array capable of storing all ids. */
    int[] IDs = new int[IDFields.length];

    try {
            /* Loop through all Fields and store id to array. */
            for(int i = 0; i < IDFields.length; i++){
                    /* All fields within the subclasses of R
                     * are Integers, so we need no type-check here. */

                    // pass 'null' because class is static
                    IDs[i] = IDFields[i].getInt(null);
            }
    } catch (Exception e) {
            /* Exception will only occur on bad class submitted. */
            throw new IllegalArgumentException();
    }
    return IDs;

后台线程不允许操作UI对象。相反,您需要使用(更简单)或(高级)

JRaymond!非常感谢我创建了一个Xthead类扩展线程,如下所示

list.setImageResource(IDs[dem]);
在onCreate()函数中


非常感谢我创建了一个Xthead类来扩展线程
class XThread extends Thread
{
    public int ids[];
    public ImageView icon;
    public int dem,n;
    XThread(int[] ids ,ImageView icon)
    {
        this.ids = ids;
        this.icon= icon;
        dem=0;
        n = ids.length;
    }

    public void run()
    {
        while(true)
        {
            try
            {
                Thread.sleep(500);
            handle.post(new Runnable()
            {
                public void run()
                {
                    ++dem;
                    icon.setImageResource(ids[dem]);
                    if(dem==n-1)
                        dem=0;
                }
            });
            }
            catch(Exception e)
            {

            }
        }
    }
}
XThread x = new XThread(IDs,list);
        x.start();