如何在android中运行线程

时间:2011-10-26 14:46:39

标签: java android multithreading

你能解释一下线程是如何工作的吗?实际上它现在工作得很好,但我想要掌握逻辑。我认为它让我有机会同时进行2次计算,所以我不必等待第一次计算。但是怎么用呢?在哪里进行第一次计算以及在何处进行第二次计算?在C ++中,我必须在分割时获取进程ID,然后我必须使用if if if(pID == 1){// first calculation}

我的课程是: 我有 ClassA 这是主要活动 ClassB :使用扩展为 SurfaceView 的竞争视图 和 ClassC :使用游戏循环扩展到线程

这里他们是: 的 ClassA的:

public class ClassA extends Activity{ 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                               WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new ClassB(this));
    }
}

ClassB的:

public class ClassB extends SurfaceView{
//Variables.......................
    private ClassC GameLoop;
//Constructor.....................    
    public GameView(final Context context) {
        super(context);

        GameLoop = new ClassC(this);
        Holder=getHolder();
        Holder.addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceChanged(SurfaceHolder/// blaa bla
                // TODO Auto-generated method stub
            }
        });
        this.setOnTouchListener(new OnTouchListener()
        {    
            //@Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        //Using canvas and drawing something on it.
    }
}

ClassC:

public class ClassC extends Thread {//GameLoop
    private ClassB view;
    private boolean running = false;

    public ClassC(ClassB view) {
        this.view = view;
    }
    public void setRunning(boolean run) {
          running = true;
    }
    @Override
    public void run() {
        while (running) {
           Canvas c;
           try {
               c = view.getHolder().lockCanvas();
               synchronized (view.getHolder()) {
                   view.onDraw(c);// Here I call onDraw to draw everything
               }
           } finally {
               if (c != null) {
                   view.getHolder().unlockCanvasAndPost(c);
               }
           }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

你是否在询问android中的线程如何工作?

在C ++中,我假设你使用Threads作为并行处理工具,将重复工作的负载分成多个处理器。

在Android中,除非您使用多核设备和特定框架(如Tegra平台),否则这种线程处理实际上是浪费时间。在Android中,最好使用线程来执行您不希望在逻辑线程或UI线程上执行的任务。

在你的情况下,我假设你正在使用android构建游戏,我建议使用两个线程:逻辑线程和UI线程。让这些异步运行,你的游戏应该顺利运行。

抱歉,我无法提供帮助,因为我不确定您的问题是什么。

有关Android中线程的更多信息,请访问Android Developers

答案 1 :(得分:0)

在classC中你不需要调用onDraw,它通过主要活动调用(如果没有,你做错了什么)。在主活动中启动逻辑线程。所以你得到两个线程 - 绘制和逻辑。 如果您在ClassC中调用onDraw,那么编写ClassZ扩展Thread,这将计算一些逻辑时刻。 在C中你这样做,以了解你在哪个线程。在Java中 - 一个Thread.run在分叉线程中做一个工作。