我在更新每隔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