这是我的第一篇文章,我没有发现任何类似内容,所以我决定问。
我正在为Android开发扑克游戏以练习SDK并刷新/改进我的Java。它是一个控制德州扑克手的简单应用程序。
最初,我只使用Java SE编写了我的类,看起来很好。每个类都有自己的目的,并使用控制台输入/输出进行测试,我可以看到它确实有效:)
上周,我决定将它移植到Android上以通过图形界面查看事情,因此我获得了资源图片,制作了一个活动并包含了我的扑克包。
在移植到Android之前我可以放一个println(或readLine)来查看最新情况并发送我的输入。现在我陷入了每个班级如何与游戏活动沟通以提供必须绘制的内容。如果可能的话,我不希望在游戏类中插入Android绘图代码。我试图找到一种方法来交换我的活动和游戏类之间的消息和Id喜欢一些建议。我是开发Android应用程序的新手,所以我不知道所有这些机制。
以下是我的活动摘录:
package my.poker.game;
//import stuff
public class ActivityHand extends Activity
{
private static Vector<Player> Players = new Vector<Player>();
public static final int MAX_PLAYERS = 8;
public static void startEmptyTable()
{
Players.removeAllElements();
Players.setSize(MAX_PLAYERS);
}
public static void LeaveTable(int pos)
{
Players.set(pos, null);
}
public static void SitTable(int pos, Player player)
{
Players.set(pos, player);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int cash = 1000;
startEmptyTable();
SitTable(0, new Jogador("William", cash));
SitTable(2, new Jogador("Richard", cash));
SitTable(4, new Jogador("John", cash));
SitTable(6, new Jogador("Paul", cash));
SitTable(8, new Jogador("Albert", cash));
//Start a Hand.... in future this will be a loop for each Hand
Hand hand = new Hand(Players);
}
}
对象牌,将选择经销商,处理牌,控制小盲注和大盲注并开始游戏循环。
问题是:hand类如何告诉Activity绘制并传递包含绘制内容的对象?
非常感谢你的帮助
编辑:我决定尝试使用Handler实现它并传递简单的消息。当我从Handler at Developers读取时,Handler对象被分配给线程的MessageQueue,所以我试着把它放到我的Activity类中(在Hand hand = new Hand(...)之前):
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
Bundle bundle = msg.getData();
// Do something with message contents
}
};
在Hand类中,当我想画一些东西时,我把它放在这里:
Handler handler = new Handler();
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("Key", "The Key's Value");
msg.setData(bundle);
handler.sendMessage(msg);
据我所知,两个处理程序都来自同一个线程,所以它们分配给同一个MessageQueue对吗?我在Hand类中发送消息的时候,Activity类可以在handleMessage方法中接收它并处理我发送的任何消息,但handleMessage不会执行。
我错过了什么?
再次感谢
答案 0 :(得分:3)
要调用活动中的方法,您需要将活动传递给此类。
例如:
public class PokerActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
Hand hand = new Hand(this);
}
public void setVisibleHand(Player player)
{
<do something in the activity>
}
}
public class Hand
{
PokerActivity pokerActivity;
public Hand(PokerActivity activity)
{
this.pokerActivity = activity;
}
public void setVisibleHand()
{
pokerActivity.setVisibleHand(player1);
}
}
现在,这可能不是最好的方法。在Android中,您必须小心不要泄漏上下文,否则您可能会遇到内存问题。 (简单地传递活动/上下文可能是一种简单的方法,但也是泄露上下文的最简单方法。)
我建议你先看看一些简单的教程,以了解android活动的工作原理。
答案 1 :(得分:2)
您可以使用Handler和Message系统在班级之间进行通信。
Lars Vogel的本教程可以帮助你Android Threads, Handlers and AsyncTask - Tutorial
答案 2 :(得分:1)
您必须创建另一个类来与您自己的类和活动本身进行交互。 从该类中,您可以使用活动上下文来控制android活动。 使用Handlers和Messages的方法很好,但需要你修改你的游戏类。
答案 3 :(得分:-1)
也许你应该扩展View Class来绘制Hand。
http://developer.android.com/reference/android/view/View.html