0

我已经在两部 Android 手机之间实现了套接字连接。本地电话需要更新一些视图元素,因为我想在自制地图上显示位置。

Android 编程指南不允许从我的活动之外更改视图元素。这意味着我不能调用这样的方法:

mainActivity.updateView(positionX);

因为我会在网络线程中运行它。那么官方的做法是什么呢?我知道有runOnUIThread但乍一看似乎是一个快速修复。

或者我应该需要一个 AsyncTask 吗?但是 API 说对于较长的任务不可行,我需要线程一直在后台运行(并且经常获取更新)。

那么创建一个新的 Handler/AsyncTask 来简单地在 MainActivity 的其他地方设置一个小图标不是一件大事吗?毕竟,我假设每秒甚至可能有 50 次更改。

希望这里有人知道正确的方法。谢谢!

PS 好的,所以请允许我问一下,是否至少有一个选项可以覆盖诸如 onDraw 方法之类的东西。毕竟,这听起来像是最好的主意,因为总是创建新线程似乎有点矫枉过正。所以我想告诉“redraw()”方法来获取我在网络线程中存储(同步)的信息。所以我不需要任何进一步的线程。有人知道吗?谢谢!

4

4 回答 4

2

你应该使用处理程序!处理程序是做你想做的事的好方法。您应该在 Activity 中实现一个处理程序,如下所示:

private class NetworkHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        Bundle data = msg.getData();
        int message = data.getInt("message");
        switch (message) {


        case Network.NET_GAME_FINISHED: UPDATE YOUR UI
                                                    break;
                    case ...
                    }
             }
}

当您从网络接收到某些东西时,您只需向该处理程序发送一条消息。

看看这个教程。

希望能帮助到你!

于 2012-08-13T15:16:36.577 回答
2

如果您有对活动的引用,则可以在 UI 线程上运行代码,如下所示:

    Activity activity = getActivity();
    activity.runOnUiThread (new Runnable() {
                            @Override
                            public void run() {
                                //UI thread code here
                            }
                        });

就个人而言,我会使用 AsyncTask,因为该类在优化创建新线程和管理其生命周期的过程方面做了更多工作。在 AsyncTask 中,您可以简单地将 UI 代码放在 onPostExecute() 方法中。

于 2012-08-13T15:20:27.213 回答
1

我建议让您的活动注册以接收意图,并且您在网络线程上运行的代码可以广播该意图。

于 2012-08-13T15:10:56.557 回答
1

如何使用服务来处理您的套接字(因为它是一个可以在后台运行的长时间运行的任务)并使用处理程序和消息实现您的 UI 和服务之间的通信(或者可能使用服务的AIDL接口和另一个朝向你的用户界面,但这会更复杂)?

于 2012-08-13T15:12:14.923 回答