我在连接到用于更新我的应用程序小部件的 android 服务中的数据库时遇到了一些问题。该程序在不使用数据库时工作正常,但是当我在服务中使用数据库时,向我显示此消息:“不幸的是,App_Name 已停止。” 该数据库用于我的所有应用程序,并且可以正常工作。
这是我在服务中使用数据库时的 LogCat:
08-25 07:53:06.536: E/AndroidRuntime(688): FATAL EXCEPTION: main
08-25 07:53:06.536: E/AndroidRuntime(688): java.lang.RuntimeException: Unable to start service msm.dictionary.iraniannames.UpdateWidgetService@414eaba0 with Intent { cmp=msm.dictionary.iraniannames/.UpdateWidgetService (has extras) }: java.lang.NullPointerException
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2376)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.ActivityThread.access$1900(ActivityThread.java:123)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.os.Handler.dispatchMessage(Handler.java:99)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.os.Looper.loop(Looper.java:137)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.ActivityThread.main(ActivityThread.java:4424)
08-25 07:53:06.536: E/AndroidRuntime(688): at java.lang.reflect.Method.invokeNative(Native Method)
08-25 07:53:06.536: E/AndroidRuntime(688): at java.lang.reflect.Method.invoke(Method.java:511)
08-25 07:53:06.536: E/AndroidRuntime(688): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-25 07:53:06.536: E/AndroidRuntime(688): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-25 07:53:06.536: E/AndroidRuntime(688): at dalvik.system.NativeStart.main(Native Method)
08-25 07:53:06.536: E/AndroidRuntime(688): Caused by: java.lang.NullPointerException
08-25 07:53:06.536: E/AndroidRuntime(688): at msm.dictionary.iraniannames.NamesDatabase.getById(NamesDatabase.java:122)
08-25 07:53:06.536: E/AndroidRuntime(688): at msm.dictionary.iraniannames.UpdateWidgetService.onStart(UpdateWidgetService.java:44)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.Service.onStartCommand(Service.java:438)
08-25 07:53:06.536: E/AndroidRuntime(688): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2359)
这是我的服务代码:
public class UpdateWidgetService extends Service {
private static final String LOG = "de.vogella.android.widget.example";
@Override
public void onStart(Intent intent, int startId) {
Log.i(LOG, "Called");
// Create some random data
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
.getApplicationContext());
int[] allWidgetIds = intent
.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
ComponentName thisWidget = new ComponentName(getApplicationContext(),
WidgetProvider.class);
int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget);
Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length));
Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length));
for (int widgetId : allWidgetIds) {
// Create some random data
int number = (new Random().nextInt(4400));
NamesDatabase db = new NamesDatabase(this);
Cursor c = db.getById(Integer.toString(number));
RemoteViews remoteViews = new RemoteViews(this
.getApplicationContext().getPackageName(),
R.layout.widgetlayout);
Log.w("WidgetExample", String.valueOf(number));
// Set the text
remoteViews.setTextViewText(R.id.update,
"Random: " + String.valueOf(number));
// Register an onClickListener
Intent clickIntent = new Intent(this.getApplicationContext(),
WidgetProvider.class);
clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
allWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
这是我在 AppWidgetProvider 中的代码:
public class WidgetProvider extends AppWidgetProvider {
public WidgetProvider() {
// TODO Auto-generated constructor stub
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// Get all ids
ComponentName thisWidget = new ComponentName(context,
WidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(),
UpdateWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
// Update the widgets via the service
context.startService(intent);
}
}