类之间的Android消息

时间:2012-10-17 14:51:10

标签: java android

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

我正在为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不会执行。

我错过了什么?

再次感谢

4 个答案:

答案 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)

您可以使用HandlerMessage系统在班级之间进行通信。

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