Пустой указатель при доступе к структуре данных, расположенной в службе Android - PullRequest
0 голосов
/ 23 декабря 2010

В моем приложении для Android запущена служба, которая содержит HashMap, который я хотел бы использовать в Activity. Поэтому я связал сервис со своей деятельностью и создал связь между ними, чтобы использовать структуру данных.

Вот как я это сделал до сих пор:

Деятельность (соответствующий код):

private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        imService = ((IMService.IMBinder) service).getService();            
    }

    public void onServiceDisconnected(ComponentName className) {
        imService = null;
        Toast.makeText(ViewFlipperTest.this,
                R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
    }
};


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    bindService(new Intent(ViewFlipperTest.this, IMService.class),
            mConnection, Context.BIND_AUTO_CREATE); 
                 .
                 .
                 .
}
protected void onResume() {
    super.onResume();
    bindService(new Intent(ViewFlipperTest.this, IMService.class),
            mConnection, Context.BIND_AUTO_CREATE);     
}

private void getMap(ViewFlipper flipper2) {

    Map<Integer, internalChatObj> tempMap = imService.getMapwData();
   }

Сервис (соответствующий код):

public class IMService extends Service implements IAppManager{
                .
                .
                .

public Map getMapwData(){
    if(getNumberOpenChats()>0){
        return openChatMapwData;
    }
    else
        return null;

}
}

Каждый раз, когда я пытаюсь запустить метод getMap (), я получаю нулевой указатель. Я даже поставил проверку, чтобы увидеть, был ли imService нулевым, и каждый раз был нулевым Кажется, что он пытается получить данные от Сервиса, но привязка к сервису нулевая, это правда? У меня есть проверка в Сервисе, чтобы отправить ноль, если карта пуста, так что это не должно быть проблемой.

Любая помощь?

Редактировать на основе советов Уилла Новый код

private ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        imService = ((IMService.IMBinder) service).getService();
        dialog.dismiss();
    }

    public void onServiceDisconnected(ComponentName className) {
        imService = null;
        Toast.makeText(ViewFlipperTest.this,
                R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
    }
};

public void onCreate(Bundle savedInstanceState) {
    dialog = ProgressDialog.show(getApplicationContext(), null,"Loading..", true, false);
}

Редактировать II

Класс IMBinder (кажется стандартным, нет?)

public class IMBinder extends Binder {
    public IAppManager getService() {
        return IMService.this;
    }
}

Нужно ли иметь IMService.this вместо этого?

1 Ответ

0 голосов
/ 23 декабря 2010

Это действительно похоже на временную проблему;Вы не должны вызывать функцию getMap, если не уверены, что переменная imService существует, то есть после вызова onServiceConnected.

...