【问题标题】:Android Widget : Displaying RAMAndroid 小部件:显示 RAM
【发布时间】:2013-01-12 02:49:40
【问题描述】:

我正在尝试为我的应用创建一个小部件,以显示设备的 CPU 使用率、电池电量和剩余 RAM;不是存储空间。

CPU 级别和电池充电代码工作正常;但 RAM 代码没有。我已经读过,为了在 AppWidgetProvider 中使用 .getSystemService() 您必须将上下文从活动传递到此处。

问题是,当该方法尝试使用 ActivityManager 设置 systemService 时,它​​会抛出:

01-11 21:29:21.468: E/AndroidRuntime(30759): java.lang.RuntimeException: Unable to instantiate receiver com.example.myfirstappex.AppWidget: java.lang.NullPointerException

我已将问题缩小到这段代码:

    import com.example.myfirstappex.MainActivity;

    public class AppWidget extends AppWidgetProvider {
    ...
    public long getRam()
{

    MemoryInfo mi = new MemoryInfo();

    Context mainCon = MainActivity.getAppContext();
    ActivityManager activityManager = (ActivityManager)mainCon.getSystemService(Context.ACTIVITY_SERVICE);

    activityManager.getMemoryInfo(mi);


    long availableMegs = mi.availMem / 1048576L;

    //Returning the value
    return(availableMegs);

}
    ...
    }

关于如何解决此问题的任何想法?还是在小部件中获取和显示 RAM 的替代方法?

编辑:整个错误日志是:

    01-11 22:21:32.426: E/AndroidRuntime(32059): FATAL EXCEPTION: main
    01-11 22:21:32.426: E/AndroidRuntime(32059): java.lang.RuntimeException: Unable to start receiver com.example.myfirstappex.AppWidget: java.lang.NullPointerException

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2383)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.app.ActivityThread.access$1500(ActivityThread.java:141)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.os.Handler.dispatchMessage(Handler.java:99)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at android.os.Looper.loop(Looper.java:137)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at android.app.ActivityThread.main(ActivityThread.java:5039)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at java.lang.reflect.Method.invokeNative(Native Method)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at java.lang.reflect.Method.invoke(Method.java:511)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

     01-11 22:21:32.426: E/AndroidRuntime(32059):   at dalvik.system.NativeStart.main(Native Method)

    01-11 22:21:32.426: E/AndroidRuntime(32059): Caused by: java.lang.NullPointerException

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at com.example.myfirstappex.AppWidget.getRam(AppWidget.java:82)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at com.example.myfirstappex.AppWidget.onUpdate(AppWidget.java:35)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:66)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2376)

    01-11 22:21:32.426: E/AndroidRuntime(32059):    ... 10 more

这仅在主应用未运行时发生。

【问题讨论】:

  • 请把整个日志贴出来好吗?所有红色的东西。

标签: android android-widget


【解决方案1】:

根据错误日志,您的问题在 AppWidget.java 的第 82 行。基于预感,我认为是ActivityManager activityManager = ...。但是,如果那不是第 82 行,请查看那里。

除此之外,如果我是对的,您需要从其他地方获取上下文。以下方法是您的 AppWidget 类的一部分:

onDeleted(Context context, int[] appWidgetIds)
onDisabled(Context context)
onEnabled(Context context)
onReceive(Context context, Intent intent)
onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

当您调用getRam() 时,您应该通过您当前使用的任何方法将Context 对象传递给它;在这种情况下,就是onUpdate()。然后,您需要修改 getRam() 以使用它:

public long getRam(Context context) {
    // ...
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    // ...
}

【讨论】:

  • 成功了!非常感谢你。那么我是不是使用了来自我的主活动而不是应用小部件的上下文错误?
  • @ADiabeticBadger 正确。正如您所说,您的崩溃是在应用程序未运行时发生的——因为它在关闭时没有上下文。
  • 我明白了。感谢你们对我的帮助。我会支持你的帖子,但我没有足够高的声誉。
  • @ADiabeticBadger 不需要投票——只需单击小复选框将答案标记为“正确”。祝你的项目好运!
猜你喜欢
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多