2013-07-22 2 views
2

Я строю свое приложение, и я использую socket.io для связи с веб-сервером. У меня есть java-файлы, которые занимаются тем, что не являются действиями и работают в фоновом режиме. Таким образом, чтобы запустить их, он будет создан в виде активности и сокеты будут работать. Теперь веб-сервер запускает сообщения, которые я обрабатываю в обратном вызове, и передаю данные активности. Теперь я ищу лучший способ передать данные из работающего класса неактивности в текущую работу.Как передать данные из класса неактивности в действие в android?

Что я сделал раньше, было использование намерения, созданного классом non-activity, который отправил данные в текущую активность. Активность должна была быть изменена на одностороннее или синглетное, чтобы избежать активности от перезапуска на себя. Проблема в том, что форма моей основной активности я не могу использовать один верхний запуск, потому что в некоторых случаях мне нужно, чтобы actvity обновлялся сам по себе.

Так что я не могу правильно получить сокеты, работающие над основным действием, потому что я могу получать данные только в том случае, если я изменю свою основную деятельность на singletop, что не идеально подходит для приложения. Я сначала попробовал назвать функцию в acivity, которая будет вызвана классом non-activity, но кажется, что это незаконно, поэтому я довольно застрял здесь.

@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"); 
      } 


     } 
    } 

Это метод класса non-activity, в котором отправляются данные.

@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)); 

} 

}

Это где намерение поймана в mainactivity. Не идеально.

+0

совместно перфорация может работать – KOTIOS

+0

Хм, я не вижу, как это будет работать, так как она должна работать в режиме реального времени , –

ответ

2

Я думаю, что вы можете счесть полезным использовать Singletons или, возможно, не-UI Fragment.Если вы не используете Фрагменты уже для своего пользовательского интерфейса, вам обязательно стоит look into it, потому что это стандарт de jure для современных приложений для Android. Более того, библиотека поддержки Android дает фрагменты полностью назад к Android 1.6, который идеально подходит для обратной совместимости.

Вы можете равномерно передавать данные и сообщения, используя Handlers между потоками. Они в основном обеспечивают трубопровод, который вы можете отправить post сообщениям и handleMessage. Вы, вероятно, запустите свои сетевые материалы в своем ApplicationonCreate и, возможно, сохраните нить как singleton. Затем вы передадите ссылку на свой UI Handler в этот поток, который затем может напрямую связаться с вашим пользовательским интерфейсом, разместив Runnables.

Интересный ответ на который «лучше» можно найти здесь:

Non-UI Fragment vs Singleton

+0

Хм, хорошо, спасибо за ответ. Я посмотрю. –

+0

Чтобы помочь вам, если вы хотите общаться или слушать в фоновом режиме на весь срок действия вашего приложения (в том числе между действиями), вам следует расширить класс 'Application' и инициализировать свои« синглтоны »там и тогда. Метод переопределения - это 'onCreate', который вызывается один раз и только один раз при запуске приложения * first *. Однако, если процесс убит андроидом (например, из-за деформации памяти), он будет вызываться снова, когда пользователь перейдет обратно. – Dororo

+0

Спасибо большое. Я работаю над вашей концепцией независимо от запуска, и это значительно упрощает мой код. –

1

Насколько я понял вопрос, вы начинаете свою деятельность, оттуда вы запускаете свой экземпляр CommunicationHandler?

тогда вы позволите своей деятельности реализовать любой вид интерфейса CallBack, создайте экземпляр своего обработчика с помощью CallBack (означает: активность) и вызовите метод вызова CallBacks.

см this question and it's answer еще несколько деталей о том, как использовать обратные вызовы

извините, если я понял, что это не так :-)

редактировать:

Ваш MainActivity (тот начинает свой SocketConnector и получение сообщения) должны обеспечить реализацию интерфейса обратного вызова. интерфейс может выглядеть следующим образом:

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

с классом сообщение выглядит как:

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); 
    } 
} 
+0

Ну не совсем. Активность запускает обработчик связи, который в свою очередь запускает socketconnector и callbackinterface. Обратные вызовы уже обрабатываются и принимаются, теперь проблема заключается в том, как получить значения из обратного вызова для текущей активности. –

+0

Вы объявили метод вызова вашего интерфейса с аргументами? позвольте мне добавить код для этого –

+0

Да. public void on (событие String, данные JSONObject); Именно так настраивается обратный вызов в интерфейсе. –

Смежные вопросы