【发布时间】:2015-08-06 08:49:49
【问题描述】:
我想知道为什么会这样。我的 MainActivity 启动一个服务并将自身传递给该服务,因此该服务可以使用它获得的数据调用 MainActivity 的方法之一(我完全意识到这不是应该做的事情)。但是,当调用此方法时,Activity 中的每个字段都为 null,并且尝试调用 findViewById() 会导致 Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference。
这意味着Activity死了,但是怎么会呢? 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);
}
}
服务
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() 来发回数据并通过在其中注册一个 BroadcastReceiver 在 Activity 中检索它,那么 Activity 仍然可以完全运行,我可以调用findViewById()。如何?生命周期之前什么时候结束,但在这种情况下没有结束?
【问题讨论】:
-
我认为这与线程问题有关,但我不确定。我没有解决方案,但是,如果您想保持这种方式,最好将活动引用移动到应用程序类,并在 onStop 中将其无效并在 onStart 中绑定引用。在意图中传递活动引用是个坏主意。编辑:我不认为你可以序列化活动,即使它只是一个参考
-
整体来说使用intents是个坏主意,哈哈哈。我只想知道原因;我永远不会真正编写这样的代码。
-
我也不知道 =( 你有没有验证过这个 ---mActivity = (Activity) intent.getSerializableExtra("ACTIVITY") --- 真的有效?我的意思是它除了空?
-
the service so the service can call one of the MainActivity's methods这是不好的方法 -
你应该使用绑定服务和服务连接来与活动和服务交互...
标签: android android-activity android-lifecycle