我在更新每隔x秒的android视图时遇到问题。Android:在x秒后多次更新gridview
要了解Android的工作方式,我正在写一个小游戏。 它有一个GameController来保存游戏循环。在循环内部,逻辑被执行,然后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
}
TextAdapter.java:
public class TextAdapter extends BaseAdapter implements IGui {
private final Context context;
private final String[] texts;
public TextAdapter(Context context) {
this.context = context;
texts = new String[height * width];
for (int i = 0; i < texts.length; i++) {
texts[i] = " ";
}
}
public int getCount() {
return height * width;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if (convertView == null) {
tv = new TextView(context);
tv.setLayoutParams(new GridView.LayoutParams(25, 25));
} else {
tv = (TextView) convertView;
}
tv.setText(texts[position]);
return tv; // <-- this happens only when game loop is done, not everytime something changed
}
@Override
public void setPlayer(int x, int y) {
texts[width * y + x] = "X";
// this.notifyDataSetChanged(); <-- this does not help (view still freases)
// gridview.invalidateViews(); does not help either
}
}
我google很多,并尝试了很多(我已经知道类似的问题,在这里已经问过,但他们也没有帮助我),但不知何故,它不起作用。 我无法得到它的工作,视图和逻辑运行在android中的不同角色,如果他们在同一个线程上运行的逻辑块视图。 任何帮助将不胜感激。
//编辑:
如果我尝试新的Thread(C)。开始(); logcat的赛斯: 了java.lang.RuntimeException:无法内螺纹已不叫Looper.prepare()
如果我添加Looper.prepare()创建的处理程序; : 了java.lang.RuntimeException:无法启动活动ComponentInfo {} GameActivity:了java.lang.RuntimeException:只有一条环线可以每个线程
如果我尝试this.runOnUiThread(三)创建;没有错误。
堆栈跟踪告诉你什么?无法触及非UI视图的视图? – Rotemmiz
我更新了我的问题,以便阅读。 – tim