2015-08-06 7 views
-3

Интересно, почему это происходит. Моя 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(). Как? Когда жизненный цикл закончился раньше, но не в этом случае?

+0

Я думаю, что это связано с проблемами потоков, но я не уверен. У меня нет решения, но если вы хотите сохранить что-то в этом роде, лучше переместить ссылку на активность в класс приложения и аннулировать его в onStop и привязать ссылку в onStart. Передача ссылок на деятельность в намерениях - плохая идея. EDIT: я не думаю, что вы можете сериализовать действия tho, даже только в качестве ссылки –

+0

Использование намерений - плохая идея в целом, хахахаха. Я просто хочу знать причину; Я никогда не буду так писать, как это по-настоящему. –

+2

Я тоже не знаю = (Вы подтвердили, что это --- mActivity = (Activity) намерение.getSerializableExtra («ДЕЯТЕЛЬНОСТЬ») --- на самом деле работает? Я имею в виду, что он дает что-то, кроме нулевого? –

ответ

1

Вы делаете это неправильно mActivity = (Activity) intent.getSerializableExtra("ACTIVITY"); Это работает?

Вы можете использовать LocalBroadcastManager или Otto для обмена данных между Service & активностью

-2

ОК, я получил его решить. Бывает так, что при сериализации объектов вы не получаете один и тот же объект в принимающей активности. Оба объекта this и mActivity имели разные идентификаторы.

+0

Не правда ли? Почему отрицательный голос и никаких объяснений? !!! –

+0

Почему вы продолжаете голосовать, не предлагая никаких объяснений? Как вы думаете, я могу чему-то научиться? –

0

Вы можете использовать трансляции для связи, обработчики сообщений, но не это. Это просто плохая практика (и, следовательно, нет «хорошего» ответа, чтобы удовлетворить вас). Не говоря уже о проблеме безопасности, которую ваш успех с использованием этой техники будет представлен для Android в целом (я говорю здесь, что это, скорее всего, НЕ возможно).

Вы должны пересмотреть вопрос о том, что вы слишком усердны в поддержке Сериализации Деятельности, потому что в конечном итоге вы не были бы на StackOverflow, если бы это было легко, плюс никакой хороший программист действительно может вам помочь, потому что ни один хороший программист этого не делает.

+0

Пожалуйста, прочитайте вопрос, который я делаю. Я УЖЕ ЗНАЮ, как заявил в сообщении, что это плохая практика. Я просто хочу знать, почему эта деятельность умирает, когда я это делаю. Это уже было решено. Поэтому, пожалуйста, прекратите публикацию материалов «Я-так-выше-вы». –

+0

Речь идет не о том, чтобы быть выше вас. Речь идет о помощи вам. Вы четко заявляете, что знаете, что это неправильно, но вы все равно хотите продолжить это. http://techterms.com/definition/gigo –

+0

Я хочу продолжить знакомство с «почему», а не с этим. Однако вы говорите, что «это не хорошая оценка», которую я уже знаю, и «нет удовлетворительного ответа», но, в конце концов, есть. –