Java Android:x秒后多次更新gridview

Java Android:x秒后多次更新gridview,java,android,ui-thread,Java,Android,Ui Thread,我在android中每x秒更新一次视图时遇到问题 为了了解android的工作原理,我正在编写一个小游戏。 它有一个控制游戏循环的游戏控制器。在循环内部,执行逻辑,然后向gui通知更改 问题是在视图中看不到更改。视图保持不变,直到游戏循环完成并仅更新一次 以下是我的代码(重要部分): GameController.java: IGui gui; public void play() { while (playing) { getAndProcessInput();

我在android中每x秒更新一次视图时遇到问题

为了了解android的工作原理,我正在编写一个小游戏。 它有一个控制游戏循环的游戏控制器。在循环内部,执行逻辑,然后向gui通知更改

问题是在视图中看不到更改。视图保持不变,直到游戏循环完成并仅更新一次

以下是我的代码(重要部分):

GameController.java:

IGui gui;

public void play() {
    while (playing) {
        getAndProcessInput();
        updateGui();
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
        }
    }
}

private void updateGui() {
    gui.setPlayer(x, y);
    // ...
}
GameActivity.java:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    GridView gridview = (GridView) findViewById(R.id.GridView1);
    TextAdapter = new TextAdapter(this);
    gridview.setAdapter(textAdapter);

    GameController c = new GameController();

    // here, the game loop shoud start.
    // what i tried:

    // new Thread(c).start();   <-- causes crash

    // c.play();     <-- causes view to frease until game loop is done

    this.runOnUiThread(c);  <-- causes view to frease until game loop is done
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView GridView=(GridView)findViewById(R.id.GridView1);
TextAdapter=新的TextAdapter(此);
setAdapter(textAdapter);
GameController c=新GameController();
//在这里,游戏循环应该开始了。
//我尝试的是:

//新线程(c.start())不确定每隔几秒钟刷新一次
列表视图要达到什么目的。无论如何,如果你正在编写一些2d游戏,你必须使用
SurfaceView
,它特别适合于持续刷新。

首先,这看起来不像是包装游戏的方式,你需要使用
SurfaceView
,或
GLSurfaceView
,以更好地执行您想要的操作。 您还可以寻找适用于android的CoCo2D,它是一个2D平台(从iPhone移植而来),可以让您的生活更轻松: 不过我想提醒你们,几个月前我试过了,但它还不是生产级的,它确实不时崩溃

无论如何,如果你还想继续前进,我会尝试回答你的问题: 我认为你在这些东西的工作方式上弄得太乱了。首先试着理解处理程序是如何与线程一起工作的

在线程上执行任何需要的操作:

   new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    try
                    {
                        calculateGameChangesHere();
                        handler.sendEmptyMessage(SUCCESS);
                    }
                    catch (Exception e)
                    {
                        handler.sendEmptyMessage(FAILURE);
                    }
                }
            }).start();
数据准备好后,告诉处理程序将其放在视图中并显示:

protected Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            if (msg.what == SUCCESS)
            {
                setCalculatedDataToaView(); // the data you calculated from your thread can now be shown in one of your views.
            }
            else if (msg.what == FAILURE)
            {
                errorHandlerHere();//could be your toasts or any other error handling...
            }
        }
    };
这涉及到所有需要大量处理/网络的内容,而这些内容不应该阻塞您的UI线程


希望这能有所帮助。

也遇到了同样的问题,并使用非常简单的代码解决了它

提示:
  • GridView必须由UI线程刷新
  • 要显示每次更改,必须使循环和休眠方法远离UI线程


    • 解决方案:

      • 方法来更新网格(将在第一个位置或任何位置构建GridView的活动放在上面)

        }

      • 构建执行该工作的非UI线程

      公共类DataReceiver实现可运行{

      private MainActivity mainActivity;
      
      public DataReceiver(MainActivity ma) {
          mainActivity = ma;
      }
      
      @Override
      public void run() {
      
          for (int i = 0; i < 100; i++) {
      
              mainActivity.runOnUiThread(new Runnable() {
                  public void run() {
                                         //update the grid here
                      mainActivity.UpdateGrid();
      
                  }
              });
                            //sleep here
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      
      }
      
      private main活动main活动;
      公共数据接收器(主活动ma){
      主要活动=毫安;
      }
      @凌驾
      公开募捐{
      对于(int i=0;i<100;i++){
      mainActivity.runOnUiThread(新的Runnable(){
      公开募捐{
      //在这里更新网格
      mainActivity.UpdateGrid();
      }
      });
      //睡在这里
      试一试{
      睡眠(1000);
      }捕捉(中断异常e){
      //TODO自动生成的捕捉块
      e、 printStackTrace();
      }
      }
      }
      

      }

      堆栈跟踪告诉您什么?无法从非UI视图触摸视图?我更新了我的问题,以便更容易阅读。谢谢,我使用处理程序将其运行。但我肯定会研究SurfaceView并在将来使用它。
      public void UpdateGrid(){
      //your logic
      
      //your way to change grid values (there are tones of other ways)
      CustomGridAdapter cga = new CustomGridAdapter(this, values);
      
      gridView.setAdapter(cga);
      gridView.invalidateViews();
      
      private MainActivity mainActivity;
      
      public DataReceiver(MainActivity ma) {
          mainActivity = ma;
      }
      
      @Override
      public void run() {
      
          for (int i = 0; i < 100; i++) {
      
              mainActivity.runOnUiThread(new Runnable() {
                  public void run() {
                                         //update the grid here
                      mainActivity.UpdateGrid();
      
                  }
              });
                            //sleep here
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      
      }