#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 выполняет одно задание в разветвленном потоке.