Нечувствительный интерфейс пользовательского интерфейса между службой и активностью - PullRequest
1 голос
/ 13 февраля 2012

У меня есть расширенный класс службы, который отвечает за работу в фоновом режиме.ну, в моих случаях, каждый раз, когда служба получает обновление, она должна передать сообщение действующему действию, чтобы пользовательский интерфейс действия также обновлялся.

Итак, я использую TabActivity, например: Main.java, и на вкладке Main.java есть действие с именем Contact.java.

Я следую за примерами сервисов переднего плана от Google, чтобы создать сервис, а на Main.java я связываю сервис:

// Reference to the service
public static EmasService serviceBinder;

// Handles the connection between the service and activity
private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
    // Called when the connection is made.
        serviceBinder = ((EmasService.EmasBinder)service).getService();
        Log.v("Main", "onServiceConnected");
        // Toast.makeText(getApplicationContext(), "Service connected!", Toast.LENGTH_LONG).show();
    }

    public void onServiceDisconnected(ComponentName className) {
    // Received when the service unexpectedly disconnects.
        serviceBinder = null;
        Main.this.stopService(serviceIntent);
        Toast.makeText(getApplicationContext(), "Service disconnected!", Toast.LENGTH_LONG).show();
    }
};

и я определяю Contact.java следующим образом:

intent = new Intent().setClass(this, Contacts.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("").setIndicator(createTabView(this,"Contact",
                      res.getDrawable(R.drawable.contact_icon)))
                  .setContent(intent);
    tabHost.addTab(spec);

хорошо, теперь для обновления интерфейса я использую интерфейс (проблемы новичка не упоминают, я знаю, что должениспользовать широковещательное намерение) под названием ServiceListener.java:

public interface ServiceListener {
public void invocation(Message message);
}

, а затем в Contact.java я инициализировал слушателя, когда достигнутое состояние onResume:

protected void bindInterface() {
    // call bind service instance to setListener this activity
    Main.serviceBinder.setListener(this);
}

и в службе он будет инициализирован:

public void setListener(ServiceListener sListener) {
    Log.v(TAG, "setListener");
    //if(listener == null) {
        //this.listener = null;
        this.listener = sListener;
    //}
}

и затем каждый раз, когда ему нужно обновить интерфейс, он устанавливает новую очередь для вектора:

lMessage.setData(bundle);
interfaceMessage.add(lMessage);

, после этого поток отправляет сообщениеинтерфейс один за другим:

while(listenerIsRun) {
            try {
                Thread.sleep(300);
                //Log.v(TAG, "InterfaceQueue: "+interfaceMessage.size());
                if(interfaceMessage.size() > 0) {
                    if(listener != null) {
                        //if(listener instanceof Contacts)
                        listener.invocation(interfaceMessage.get(0));// invoke the message
                        interfaceMessage.remove(0);// don't forget to remove invoked msg
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

и в Contact.java он поймает сообщение вот так:

public void invocation(Message message) {
    contactHandler.sendMessage(message);
}

// TODO handler which handle ui message from service
private Handler contactHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
                // all updating process goes here...
            }
     };

хорошо, я предполагаю, что этот способ заставил бы его работать легко, но на самом деле это не так!иногда он обновляет пользовательский интерфейс, но иногда он просто не отвечает, ПОЧЕМУ?

Пожалуйста, скажите мне, если я что-то пропустил или нужно что-то добавить ...

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...