我在每 x 秒更新一次 android 中的视图时遇到问题。
为了了解 android 的工作原理,我正在编写一个小游戏。它有一个保存游戏循环的 GameController。在循环内部,逻辑被执行,之后 gui 将被告知更改。
问题是在视图中看不到更改。视图保持不变,直到游戏循环完成并且只更新一次。
这是我的代码(重要部分):
游戏控制器.java:
IGui gui;
public void play() {
while (playing) {
getAndProcessInput();
updateGui();
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
}
}
}
private void updateGui() {
gui.setPlayer(x, y);
// ...
}
游戏活动.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
}
文本适配器.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
}
}
我用谷歌搜索了很多,也尝试了很多(我确实知道这里已经问过类似的问题,但他们也没有帮助我),但不知何故它不起作用。我无法让视图和逻辑在 android 的不同线程上运行,如果它们在同一个线程上运行,逻辑会阻塞视图。任何帮助将不胜感激。
// 编辑:
如果我尝试 new Thread(c).start(); LogCat sais:java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序
如果我添加 Looper.prepare(); : java.lang.RuntimeException: 无法启动活动 ComponentInfo{GameActivity}: java.lang.RuntimeException: 每个线程只能创建一个 Looper
如果我尝试 this.runOnUiThread(c); 没有错误。