Как работает поток в Android

#java #android #multithreading

#java #Android #многопоточность

Вопрос:

Можете ли вы объяснить мне, как работает поток. На самом деле сейчас он работает просто отлично, но я хочу понять логику. Я думаю, что это дает мне возможность выполнить 2 вычисления одновременно, поэтому мне не нужно ждать первого вычисления для and . Но как его использовать? Куда поместить первое вычисление и куда поместить второе вычисление? В C я должен получить идентификатор процесса, когда я его разделяю, а затем я должен использовать if что-то вроде этого if(pID==1){// первое вычисление}

Мои классы: у меня есть 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);
               }
           }
        }
    }
}
  

Ответ №1:

Вы спрашиваете, как потоки в целом работают в Android?

Я предполагаю, что в C вы использовали потоки как инструмент параллельной обработки, чтобы разделить нагрузку на повторяющуюся часть работы между несколькими процессорами.

В Android, если вы не используете многоядерное устройство и специальную платформу, такую как платформа Tegra, такая обработка потоков фактически является пустой тратой времени. В Android лучше использовать потоки для выполнения задач, которые вы не хотите рисковать, выполняя в логическом потоке или потоке пользовательского интерфейса.

В вашем случае, я предполагаю, что вы создаете игру с использованием Android, я бы рекомендовал использовать два потока: логический поток и поток пользовательского интерфейса. Запускайте их асинхронно, и ваша игра должна работать бесперебойно.

Извините, я не могу больше помочь, так как я не совсем уверен, в чем заключается ваш вопрос.

Более подробную информацию о потоках в Android можно найти здесь Разработчики Android

Ответ №2:

В ClassC вам не нужен вызов onDraw, он вызывается по основному действию (если нет, вы делаете что-то неправильно). Запустите логический поток в основном действии. Таким образом, вы получаете два потока — draw и logic. Если вы вызываете onDraw в ClassC, то напишите ClassZ extend Thread, который вычислит некоторые логические моменты. В C вы делаете это, чтобы понять, в каком потоке вы находитесь. В Java — один поток.run выполняет одно задание в разветвленном потоке.