问题描述
|
首先,对不起我的英语。所以我正在制作一个程序,当用户需要时会提醒用户
服用他/她的药物。我的基本想法:
1 AlarmManager向我发送信号
2我用广播接收器捕获到该信号,
3,广播接收器启动我的服务和我的活动。
服务从10分钟开始倒数,每分钟将检查数据库中的其他参数
活动将发出声音并振动。因为会有更多的药物,所以我列出了
纽扣。并且由于服务和活动使用相同的游标,因此该服务与
数据库。因此,当我的Activity启动时,它需要从Service(用于cursoradapter)中获取光标。
而且,如果服务或活动更改了游标,我需要刷新该游标,因此我在服务中进行了重新查询。
唯一的问题是,尽管我的bindService给我真实的结果,但我的onServiceConnected
方法没有运行完,因此当我尝试调用public service方法(对于游标)时,我得到了nullpointer异常
从我的活动中。我尝试在onStartCommand之后从服务启动我的Activity,但结果也是空指针。
完成任务的最佳方法是什么?
我应该从服务中删除我的服务并从活动中创建另一个线程(AsyncTask)吗?
好吧,我试图抓住重要的部分。
package elte.thesis.broadcastreceivers;
import elte.thesis.alarmsmanager.AlarmActivity;
import elte.thesis.alarmsmanager.WakeLockManager;
import elte.thesis.database.Utility;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/*
* This broadcastReceiver will receive the ALARM from the AlarmManager
* and it will
* 1,start the Service and
* 2,show the AlarmActivity
*/
public class DosageAlarmReceiver extends broadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
Log.v(\"Szakbarbar\",\"AlarmManager send me the next \" + \"alarm time: \" + intent.getStringExtra(\"AlarmTime\"));
/*
* It seems that the alarmmanager release the wakelock as soon as our
* onReceive method return,so we need to make our own wakelock
*/
WakeLockManager.acquirecpuWakeLock(context);
/*
* Start the service and give him the time what we got from alarm manager
*/
Log.v(\"Szakbarbar\",\"Elinditjuk a servicunket\");
Intent serviceIntent = new Intent(Utility.ALARM_SERVICE);
serviceIntent.putExtra(\"AlarmTime\",intent.getStringExtra(\"AlarmTime\"));
context.startService(serviceIntent);
/*
* Start the AlarmActivity where the user can sign that he got in the
* pills
*/
Log.v(\"Szakbarbar\",\"Elinditjuk az activitinket\");
Intent alarmActivity = new Intent(context,AlarmActivity.class);
alarmActivity.putExtra(\"AlarmTime\",intent.getStringExtra(\"AlarmTime\"));
alarmActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
context.startActivity(alarmActivity);
}
}
在我的AlarmActivity中
AlarmService mService;
...
@Override
public void onStart() {
super.onStart();
Log.v(\"Szakbarbar\",\"Bind to the Service\");
Intent intent = new Intent(Utility.ALARM_SERVICE);
boolean connection = bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
Log.v(\"Szakbarbar\",\"Binded to the Service : \" + ((connection==true)?\"kapcsolt\":\"nemkapcsolt\"));
}
@Override
public void onResume() {
super.onResume();
Log.v(\"Szakbarbar\",\"Need the cursor from the Service\");
updateDosageAdapter();
//Make one private register to Now when the AlarmService made change on the cursor
registerReceiver(mReceiver,new IntentFilter(Utility.ALARMS_CHANGED));
if (!mute) {
if (volume < 1)
incAlarmVolume();
mVibrator.vibrate(sVibratePattern,0);
player.start();
}
}
/** Defines callbacks for service binding,passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,IBinder service) {
// We\'ve bound to LocalService,cast the IBinder and get LocalService instance
Log.v(\"Szakbarbar\",\"mService itt még nulla\");
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
Log.v(\"Szakbarbar\",\"mService itt már nem nulla\");
}
@Override
public void onServicedisconnected(ComponentName arg0) {
mBound = false;
}
};
public void updateDosageAdapter() {
Log.v(\"Szakbarbar\",\"1\");
alarmsCursor = mService.refreshCursor();
Log.v(\"Szakbarbar\",\"2\");
startManagingCursor(alarmsCursor);
Log.v(\"Szakbarbar\",\"3\");
if (alarmsAdapter == null) {
Log.v(\"Szakbarbar\",\"4\");
alarmsAdapter = new AlarmsAdapter(this,alarmsCursor);
alarmsList = (ListView) findViewById(R.id.dosage_alarm_list);
alarmsList.setAdapter(alarmsAdapter);
alarmsList.setVerticalScrollBarEnabled(true);
alarmsList.setScrollContainer(false);
alarmsList.setonCreateContextMenuListener(this);
} else {
Log.v(\"Where is nullpointerexception\",\"5\");
alarmsAdapter.changeCursor(alarmsCursor);
}
}
而在我的服务
private final IBinder mBinder = new LocalBinder();
...
// Return this instance of AlarmService so clients can call public methods
public class LocalBinder extends Binder {
AlarmService getService() {
return AlarmService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
//Refresh the cursor
public Cursor refreshCursor() {
Log.v(\"Szakbarbar\",\"ResreshCrusor : \" + alarmTime);
alarmCursor = Utility.selectDosageAlarms(alarmTime);
return alarmCursor;
}
我的问题的简短描述
我想您还不知道我的问题是什么。我英语不好,很抱歉给您带来麻烦。虽然我在onStart()上调用bindService()
当我调用(也从AlarmActivity)updateDosageAdapter()时使用AlarmActivity的方法,该方法使用我从Service获得的refreshCursor()方法
空指针异常,因为onServiceConnected()方法尚未运行完毕,并且我的mService变量应保持
我的服务参考为空。
解决方法
我设法找到一个解决方案,如本文所述