2

我正在构建我的应用程序,并且正在使用 socket.io 与网络服务器进行通信。我有 java 文件来处理那些不是活动并在后台运行的文件。所以要启动它们,它将在一个活动中实例化,并且套接字将运行。现在网络服务器触发我在回调中处理的消息并将数据传递给一个活动。现在我正在寻找将数据从正在运行的非活动类传递到当前正在运行的活动的最佳方法。

我之前所做的是使用由非活动类创建的意图,它将数据发送到当前正在运行的活动。必须将活动更改为单实例或单顶以避免活动继续自行重新启动。问题是,在我的主要活动中,我不能使用单顶启动模式,因为在某些情况下我需要活动自行刷新。

所以我无法让套接字在主要活动上正常工作,因为如果我将主要活动更改为单顶活动,我只能接收数据,这对于应用程序来说并不理想。我首先尝试在非活动类调用的活动中命名一个函数,但似乎这是非法的,所以我被困在这里。

@Override
    public void on(String event, IOAcknowledge ack, Object... data) {

        System.out.println("Server may have triggered event '" + event + "'");

        if (event.equals("message")) {
        System.out.println(data[2]);

        Intent newIntent = new Intent(Chat.mContent, Chat.class);
        Bundle extras=new Bundle();
        extras.putString("name", (String)data[1]);
        extras.putString("MSG", (String)data[2]);
        newIntent.putExtras(extras);


        Chat.mContent.startActivity(newIntent);

        }
        if (event.equals("ready")) {
            System.out.println("Received the ready callback");
            try{
            Intent newIntent = new Intent(TabExercise.mContext, TabExercise.class);
            newIntent.putExtra("ready", event);
            TabExercise.mContext.startActivity(newIntent);
            }catch(Exception e){
                System.out.println("Caught an error");
            }


        }
    }

这是发送数据的非活动类中的方法。

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Bundle extras=intent.getExtras();

if (intent.hasExtra("ready")) {
    // Retrieve the message and call getMsg(String)
   connect.starter(SaveSharedPreference.getName(TabExercise.this), SaveSharedPreference.getUserId(TabExercise.this));

}

}

这是主要活动中捕获意图的地方。不理想。

4

2 回答 2

2

我认为您可能会发现有用的是使用Singletons或者可能是非 UI Fragment。如果您还没有在 UI 中使用 Fragments,那么您绝对应该研究一下,因为它是现代 Android 应用程序的法律标准。更重要的是,Android 支持库让 Fragments 一直回到 Android 1.6,这是向后兼容的理想选择。

Handlers您同样可以在线程之间传递数据和消息。这些基本上提供了一个管道,您可以post向 和 发送消息handleMessage。您可能会在您的网络中启动您的网络内容,Application onCreate并且可能将线程存储为singleton. 然后,您会将对您的 UI 的引用传递Handler给该线程,然后该线程可以通过发布直接与您的 UI 通信Runnables

可以在此处找到“更好”的有趣答案:

非 UI 片段与单例

于 2013-07-22T20:04:23.057 回答
1

据我理解的问题,你开始你的活动,从那里开始你的 CommunicationHandler 实例?

然后您将让您的活动实现任何类型的 CallBack 接口,使用 CallBack 实例化您的处理程序(意味着:活动)并调用 CallBacks 调用方法。

看到这个问题,它是有关如何使用回调的更多详细信息的答案

对不起,如果我理解错了:-)

编辑:

您的 MainActivity(启动 SocketConnector 并接收消息的那个)应该提供回调接口的实现。界面可能如下所示:

public interface IMessageReceiver {
  public void onMessageReceived(Message m);
}

你的 Message 类看起来像:

public class Message {
  String name;
  String msg;
  //add getter/setter and constructor to fit your needs
}

那么您的主要活动应如下所示:

public class MainActivity extends Activity implements IMessageReceiver {
  //... main activity code here.
    SocketConnector mySC = new SocketConnector(this);
  //... more main activity code here.
  public void onMessageReceived(Message m) {
    //do something with the message, e.g. display to edit texts, lists etc.
  }
}

并且在您的 SocketConnector 中,您将 IMessageReceiver 定义为最终成员并调用receiver.onMessageReceived(m)- 应该像

IMessageReceiver receiver

public SocketConnector(IMessageReceiver receiver) {
  this.receiver = receiver;
}

@Override
public void on(String event, IOAcknowledge ack, Object... data) {
  if (event.equals("message")) {
      System.out.println(data[2]);

      //Intent newIntent = new Intent(Chat.mContent, Chat.class);
      //Bundle extras=new Bundle();
      //extras.putString("name", (String)data[1]);
      //extras.putString("MSG", (String)data[2]);
      //newIntent.putExtras(extras);


      //Chat.mContent.startActivity(newIntent);
      Message m = new Message();
      m.name = (String)data[0];
      m.msg = (String)data[1];
      this.receiver.onMessageReceived(m);
    }
}
于 2013-07-22T19:37:46.213 回答