2

デバイスの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

これは、メインアプリが実行されていない場合にのみ発生します。

4

1 に答える 1

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);
    // ...
}
于 2013-01-12T03:26:33.163 に答える