0

アプリケーションのウィジェットを更新するために使用される 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);
  }

}
4

0 に答える 0