Android和线程

时间:2012-01-07 03:31:47

标签: android android-layout

喂,

我有一个活动,其布局由单个FrameLayout组成。我有一个扩展View的类,然后将其添加到此布局中。

我想继续吸引这种观点,就像在游戏循环中一样。

问题是我是android的新手,这个线程的东西没有任何意义..

除非我在主UI线程中,否则我真的不能更新布局吗? 我如何开始初始化线程? :(

编辑::这就是我想出来的,但它没有用任何东西更新我的框架。

    public class GameFrame extends View
    {
        private GameThread m_gt;

        public GameFrame(Context context, int width int height){
                //do some initialisation stuff
        }

        public GameThread getGameThread(){
                if(m_gt != null){
                    return m_gt;
                }else{
                    m_gt = new GameThread(this);
                    return m_gt;
                }
        }
        @Override
        public void onDraw(Canvas canvas){
                //Draw loads of stuff
        }

        public class GameThread extends AsyncTask<Void, Void, Void>
        {

            private GameFrame m_gf;

            public GameThread(GameFrame gf){
                m_gf = gf;
            }

            @Override
            protected void onProgressUpdate(Void... arg0){
                System.out.println("Wahoo");
                m_gf.invalidate();
            }

            @Override
            protected Void doInBackground(Void... arg0) {
                long start, end;
                while(some bool){

                    System.out.println("Threadin'");

                    publishProgress();

                    //Fiddle with some values
                }
                return null;
            }

        }
    }

然后在主要活动中初始化它:

private FrameLayout frame;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    ...

    frame = (FrameLayout) findViewById(R.id.gameframe);
    GameFrame gf = new GameFrame(this, width, height);

    frame.addView(gf);
    gf.getGameThread().execute();
}

我对Async的理解是否正确?这应该在onDraw中给出有效的代码吗?

我应该说打印输出“wahoo”和“threading”正在打印多次,所以必须正确地发生一些事情。更重要的是,如果它打印了“wahoo”,那么肯定它应该重新绘制我的视图......但没有任何反应:(

1 个答案:

答案 0 :(得分:1)

您使用AsyncTask

这有两种方法允许您在线程运行之前和之后更新主UI

正如汤姆在评论中所说,如果你想在运行asynctask时继续更新主用户界面,请查看this你可以通过publishProgress()

执行此操作