2016-07-01 5 views
0

Ich mache eine Musik-Player-App. Wenn ich in SongsFragment.java auf ein Listenelement klicke, sendet es eine Absicht an PlayerActivity.java mit der Songposition. Der MusikSRV ist immer Null. Ich suchte auf Google nach Aktivität lifecyle und herausgefunden, dass es etwas damit zu tun hat. Da ich Anfänger bin, konnte ich das nicht anwenden.Dienstobjekt wird nicht initialisiert/kein Aufruf onServiceCreated

SongsFragment:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    //musicSrv.setSong(position); 
    //musicSrv.playSong(); 
    Intent intent = new Intent(getContext(), PlayerActivity.class); 
    intent.putExtra("pos", position); 
    startActivity(intent); 
} 

In PlayerActivity.java:

public class PlayerActivity extends AppCompatActivity { 
private MusicService musicSrv; 
private Intent playIntent; 
private boolean musicBound=false; 
private static final String POS = "pos"; 
private int passedPos; 



protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle extras = getIntent().getExtras(); 
    passedPos = extras.getInt("pos",0); 
    musicSrv.setSong(passedPos); 
    musicSrv.playSong(); 

    setContentView(R.layout.activity_player); 
} 


ServiceConnection musicConnection = new ServiceConnection(){ 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     MusicService.MusicBinder binder = (MusicService.MusicBinder)service; 
     //Get service 
     musicSrv = binder.getService(); 
     //Pass list 
     ArrayList<Song> songs = ((DataFetcher)getApplicationContext()).songList; 
     musicSrv.setList(songs); 
     musicBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     musicBound = false; 
    } 
}; 

@Override 
public void onStart() { 
    super.onStart(); 
    if(playIntent==null) { 
     playIntent = new Intent(this,(Class)MusicService.class); 
     bindService(playIntent,musicConnection, Context.BIND_AUTO_CREATE); 
     startService(playIntent); 
    } 
} 

@Override 
public void onDestroy() { 
    stopService(playIntent); 
    musicSrv=null; 
    super.onDestroy(); 
} 

}

Fehler: Ich erhalte "Attempt to invoke virtual method 'void services.MusicService.setSong(int)' on a null object reference"

Antwort

1

Zuerst onCreate() vor onStart() genannt wird. musicSrv wird null sein, weil Sie bindService() noch nicht aufgerufen haben.

Zweitens ist bindService() selbst asynchron. Es wird einige Zeit später sein, bevor Ihre onServiceConnected()-Methode aufgerufen wird.

Sie können nicht musicSrv verwenden, bis Sie diesem Feld einen Wert zuweisen, und Sie können das frühestens innerhalb von onServiceConnected() nicht tun.

Also, verschieben Sie Ihre Anrufe im Zusammenhang mit musicSrv in onServiceConnected() oder etwas späteres Ereignis, nachdem Sie wissen, dass musicSrv sollte bereit sein.

Rufen Sie auch nicht direkt bindService() an, da Sie dadurch bei Konfigurationsänderungen mit dieser Aktivität Probleme bekommen. Rufen Sie bindService() (und später unbindService()) unter Verwendung des Application Objekts (z. B. getApplicationContext().bindService()) auf.

+0

Vielen Dank !! Ich habe Anweisungen von musicSrv zu onServiceConnected() verschoben, jetzt werden Songs abgespielt. –