2013-01-12 29 views
2

我想爲我的應用程序創建一個小部件,顯示設備的CPU使用率,電池電量和剩餘的RAM;不是存儲空間。Android小工具:顯示內存

CPU級別和電池充電代碼工作正常;但是RAM代碼沒有。我已經閱讀過,爲了在AppWidgetProvider中使用.getSystemService(),您必須將活動的上下文傳遞到此處。

的問題是,當方法試圖建立一個systemService與ActivityManager,它拋出:

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 

這隻有在主應用程序沒有運行情況。

+0

您可以發佈整個日誌嗎?所有的紅色的東西。 – Eric

+0

我已添加日誌。 – ADiabeticBadger

回答

0

根據錯誤日誌,你的問題在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); 
    // ... 
} 
+0

它工作!非常感謝你。那麼我是否通過使用我的主要活動而不是應用小部件來使用錯誤的上下文? – ADiabeticBadger

+0

@ADiabeticBadger正確。正如你所說,你的崩潰是當應用程序沒有運行時 - 因爲它關閉時沒有上下文。 – Eric

+0

我明白了。感謝你們對我的幫助。我會upvote你的帖子,但我沒有足夠高的聲譽。 – ADiabeticBadger