Android и Threading - PullRequest
       0

Android и Threading

0 голосов
/ 07 января 2012

Алло,

У меня есть действие, макет которого сделан из одного FrameLayout. У меня есть класс, который расширяет вид, который затем добавляется в этот макет.

Я хочу постоянно рисовать в этом виде, как в игровом цикле.

Проблема в том, что я новичок в Android, и эта тема не имеет смысла ..

Могу ли я действительно не обновлять макет, если я не в основном потоке пользовательского интерфейса? Как мне начать инициализацию потоков? (

РЕДАКТИРОВАТЬ :: Это то, что я придумал, но это не обновляет мой кадр с чем-либо.

    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?

Я, наверное, должен сказать, что распечатки "вау" и "нити" печатаются много раз, поэтому что-то должно происходить правильно. Что еще более важно, если он напечатал «вау», то, конечно, он должен затем перерисовать мой вид ... но ничего не происходит: (

1 Ответ

1 голос
/ 07 января 2012

Вы используете AsyncTask

. У этого есть два метода, которые позволяют вам обновлять основной интерфейс до и после выполнения потока

Также, как сказал Том впримечание: если вы хотите продолжать обновлять основной интерфейс пользователя во время выполнения асинхронной задачи, проверьте this . Это можно сделать с помощью publishProgress ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...