【问题标题】:Unable to fetch database values in RemoteView无法在 RemoteView 中获取数据库值
【发布时间】:2012-03-02 11:18:25
【问题描述】:

我想制作一个 AppWidget,我定义了布局、应用小部件的信息、广播接收器和处理 AppWidget 的服务。

            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
            .getApplicationContext());
    int[] allWidgetIds = intent
            .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

    ComponentName thisWidget = new ComponentName(getApplicationContext(),
            SmsSchedulerWidget.class);

    RemoteViews remoteViews = new RemoteViews(this.getApplicationContext()
            .getPackageName(), R.layout.schdulesms_appwidget_layout);

    DatabaseManager dbManager = new DatabaseManager(context.getApplicationContext());
    dbManager.open();
    String contactNumber = dbManager.fetchContactNumber();
    String date = dbManager.fetchDate();
    String message = dbManager.fetchMessage();
    String status = dbManager.fetchStatus();

    remoteViews.setTextViewText(R.id.to_appwidget_saved_data, contactNumber);
    remoteViews.setTextViewText(R.id.date_appwidget_saved_data, date);
    remoteViews.setTextViewText(R.id.status_appwidget_saved, message);
    remoteViews.setTextViewText(R.id.message_appwidgset_saved_data, status);

    appWidgetManager.updateAppWidget(thisWidget, remoteViews);

这是我的代码......

但在其他活动中,我可以轻松检索数据库值,而不会出现任何空指针异常。如果有人能指出我的代码有什么问题,我将不胜感激......

日志猫错误是:

03-02 17:26:32.174:E/AndroidRuntime(32265):致命异常:主要 03-02 17:26:32.174: E/AndroidRuntime(32265): java.lang.RuntimeException: Unable to start service com.android.braindigit.schedulesms.appWidgetService@4053da30 with Intent { cmp=com.android.braindigit.schedulesms/ .appWidgetService(有附加功能)}:java.lang.NullPointerException 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2052) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.ActivityThread.access$2800(ActivityThread.java:117) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:994) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.os.Looper.loop(Looper.java:130) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 java.lang.reflect.Method.invoke(Method.java:507) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 03-02 17:26:32.174:E/AndroidRuntime(32265):在 dalvik.system.NativeStart.main(本机方法) 03-02 17:26:32.174: E/AndroidRuntime(32265): 引起: java.lang.NullPointerException 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 com.android.braindigit.schedulesms.DatabaseManager.open(DatabaseManager.java:36) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 com.android.braindigit.schedulesms.appWidgetService.onStart(appWidgetService.java:41) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.Service.onStartCommand(Service.java:428) 03-02 17:26:32.174: E/AndroidRuntime(32265): 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039) 03-02 17:26:32.174: E/AndroidRuntime(32265): ... 10 更多

【问题讨论】:

  • 某处某处为空。通过仔细查看 logcat,您可能会找到行号,并且运气好可以确定未正确初始化的对象。通过分享这些信息,有人可能会为您提供帮助
  • 关于 NullPointerException 提及的整个胡言乱语。在你的 logcat 中所有的都是红色的。围绕错误的 2O 奇数行
  • 您的问题在于com.android.braindigit.schedulesms.DatabaseManager.open(),如堆栈跟踪所示。此外,请删除所有对 getApplicationContext() 的引用,除非您确切地知道为什么要使用它

标签: android android-appwidget


【解决方案1】:

好吧,我不知道回答我自己的问题有多真实,但我认为如果其他人遇到与我相同的问题,它会对其有所帮助.....所以,在敲了几个小时之后,我终于意识到我正在传递一个空上下文。所以,我做了以下事情并且它起作用了......

我从广播接收器向我的服务传递了以下意图:

    Intent intent = new Intent(context.getApplicationContext(),appWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds);
    intent.putExtra("contactNumber", contactNumber);
    intent.putExtra("date", date);
    intent.putExtra("message",message);
    intent.putExtra("status", status);
    //update the widgets via the service

在服役期间,我做了以下事情:

    String contactNumber = intent.getStringExtra("contactNumber");
    String date = intent.getStringExtra("date");
    String message =intent.getStringExtra("message");
    String status = intent.getStringExtra("status");


    for (int widgetId : allWidgetIds) {
        RemoteViews remoteViews = new RemoteViews(this
                .getApplicationContext().getPackageName(),
                R.layout.schdulesms_appwidget_layout);



        remoteViews.setTextViewText(R.id.to_appwidget_saved_data,
                contactNumber);
        remoteViews.setTextViewText(R.id.date_appwidget_saved_data, date);
        remoteViews.setTextViewText(R.id.status_appwidget_saved, message);
        remoteViews.setTextViewText(R.id.message_appwidgset_saved_data,
                status);

        appWidgetManager.updateAppWidget(thisWidget, remoteViews);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2015-10-27
    • 2018-11-30
    相关资源
    最近更新 更多