Android小部件:显示RAM
我正在尝试为我的应用程序创建一个小部件,显示设备的CPU使用情况、电池电量和剩余RAM;不是存储空间 CPU水平和电池充电代码工作正常;但是RAM代码没有。我已经读过,为了在AppWidgetProvider中使用.getSystemService(),必须将上下文从活动传递到此处 问题是,当该方法尝试使用ActivityManager设置systemService时,会抛出:Android小部件:显示RAM,android,android-widget,Android,Android Widget,我正在尝试为我的应用程序创建一个小部件,显示设备的CPU使用情况、电池电量和剩余RAM;不是存储空间 CPU水平和电池充电代码工作正常;但是RAM代码没有。我已经读过,为了在AppWidgetProvider中使用.getSystemService(),必须将上下文从活动传递到此处 问题是,当该方法尝试使用ActivityManager设置systemService时,会抛出: 01-11 21:29:21.468: E/AndroidRuntime(30759): java.lang.Runt
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
这仅在主应用程序未运行时发生。根据错误日志,您的问题出现在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 Correct。正如你所说,你的崩溃发生在应用程序未运行时,因为它关闭时没有上下文。我明白了,我明白了。谢谢你帮助我。我会投票支持你的帖子,但我的声望不够高。@ADiabeticBadger无需投票支持——只需单击小复选框将答案标记为“正确”。祝你的项目好运!