我想知道为什么会这样。我的MainActivity启动一个服务并将自己传递给服务,因此服务可以使用它获得的数据调用MainActivity的一个方法(我完全清楚这不是应该做的事情)。但是,调用此方法时,活动中的每个字段都为空,并且尝试调用findViewById()
会导致Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
。
这意味着活动死了,但是怎么来的?活动的生命周期尚未结束。垃圾收集器为什么要把它带走?
请看一下代码:
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在活动中检索数据,则活动仍然完全正常运行,我可以调用findViewById()
。怎么样?生命周期何时结束,但不是在这种情况下?
答案 0 :(得分:1)
你这样做是错误的mActivity = (Activity) intent.getSerializableExtra("ACTIVITY");
它有效吗?
您可以使用LocalBroadcastManager或Otto进行Service&amp ;;之间的通信活性
答案 1 :(得分:0)
您可以使用广播与消息处理程序进行通信,但不能使用广播。这只是一种不好的做法(因此没有“满足你的好”答案)。更不用说使用这种技术的成功将为整个Android带来的安全问题(我在这里说的是,这很可能是不可能的)。
你应该重新考虑过于热衷于维护活动的序列化,因为如果它很容易就不会出现在StackOverflow上,加上没有优秀的程序员可以真正帮助你,因为没有优秀的程序员可以做到这一点。
答案 2 :(得分:-2)
好的,我解决了。碰巧的是,在序列化对象时,您不会在接收活动中获得相同的对象。 this
和mActivity
个对象都有不同的ID。