Интересно, почему это происходит. Моя MainActivity запускает сервис и передает себя службе, поэтому служба может вызывать один из методов MainActivity с полученными данными (я полностью понимаю, что это не так, как должно быть сделано). Однако, когда этот метод вызывается, каждое поле в Управлении имеет значение null и пытается вызвать findViewById()
результатов в Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
.Почему активность начинается после запуска Сервиса?
Это означает, что операция умерла, но как получилось? Жизненный цикл Activity не завершен. Почему сборщик мусора забрал его?
Пожалуйста, обратите внимание на код:
MainActivity
public class MainActivity extends Activity implements Serializable{
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, Servicio.class);
intent.putExtra("ACTIVITY", this);
startService(intent);
}
public void loadList(List<Data>){
mList = (LinkedList<Data> dataList;
mRecyclerView = (RecyclerView) this.findViewById(R.id.rv);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(linearLayoutManager);
mAdapter = new MyAdapter(this, mList);
mRecyclerView.setAdapter(mAdapter);
}
}
Service
public class MyService extends Service {
private Thread mThread;
private Activity mActivity;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mThread = new Thread(new Runnable() {
@Override
public void run() {
execute();
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
mActivity = (Activity) intent.getSerializableExtra("ACTIVITY");
mThread.start();
return super.onStartCommand(intent, flags, startId);
}
public void execute(){
dataObtained = doStuff();
((MainActivity) mActivity).loadList(dataObtained);
}
}
Однако, если я использую sendBroadcast()
в службе отправить обратно данных и получить их в Activity, зарегистрировав BroadcastR в нем активность остается полностью работоспособной, и я могу позвонить findViewById()
. Как? Когда жизненный цикл закончился раньше, но не в этом случае?
Я думаю, что это связано с проблемами потоков, но я не уверен. У меня нет решения, но если вы хотите сохранить что-то в этом роде, лучше переместить ссылку на активность в класс приложения и аннулировать его в onStop и привязать ссылку в onStart. Передача ссылок на деятельность в намерениях - плохая идея. EDIT: я не думаю, что вы можете сериализовать действия tho, даже только в качестве ссылки –
Использование намерений - плохая идея в целом, хахахаха. Я просто хочу знать причину; Я никогда не буду так писать, как это по-настоящему. –
Я тоже не знаю = (Вы подтвердили, что это --- mActivity = (Activity) намерение.getSerializableExtra («ДЕЯТЕЛЬНОСТЬ») --- на самом деле работает? Я имею в виду, что он дает что-то, кроме нулевого? –