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