7

这是我的第一篇文章,我没有发现任何类似的东西,所以我决定问一下。

我正在为 Android 开发一个扑克游戏来练习 SDK 并刷新/改进我的 Java。它是一个控制德州扑克手的简单应用程序。

最初,我只使用 Java SE 编写了我的类,它看起来不错。每个类都有自己的目的并使用控制台输入/输出对其进行测试,我可以看到它确实有效:)

上周,我决定将它移植到 Android 以通过图形界面查看发生的事情,因此我获取了资源图像,制作了一个 Activity 并包含了我的扑克包。

在移植到 Android 之前,我可以放一个 println(或 readLine)来查看发生了什么并发送我的输入。现在我陷入了每个类如何与游戏活动通信以提供必须绘制的内容。如果可能的话,我不想在游戏类中插入 Android 绘图代码。我试图找到一种在我的活动和游戏类之间交换消息的方法,并且我喜欢一些建议。我是开发 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 进行绘制并传递一个包含要绘制什么的对象?

非常感谢你的帮助


编辑:我决定尝试使用处理程序实现它并传递简单的消息。正如我从Developers 的 Handler 中读到的,一个 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 不执行。

我错过了什么?

再次感谢

4

4 回答 4

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 活动的工作原理。

于 2012-10-17T15:11:19.420 回答
2

您可以使用处理程序和消息系统在您的类之间进行通信。

Lars Vogel 的本教程应该可以帮助您了解Android 线程、处理程序和 AsyncTask - 教程

于 2012-10-17T15:01:16.190 回答
1

您将不得不创建另一个类来与您自己的类和活动本身进行交互。从该类中,您可以使用活动上下文来控制 android 活动。使用处理程序和消息的方法很好,但需要您修改游戏类。

于 2012-10-17T15:03:03.353 回答
-1

也许你应该扩展 View Class 来绘制手。

http://developer.android.com/reference/android/view/View.html

于 2012-10-17T15:20:05.763 回答