2011-09-15 17 views
3

我都有Android語境有點問題,我不知道如何解決problem.Here是我使用的代碼:機器人方面的NullPointerException

public class TestActivity { 
Context context; 
public static String getPackageVersion(){ 
     try { 
      PackageManager pm = context.getPackageManager(); 
      PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0); 
      version = packageInfo.versionName; 
     } catch (NameNotFoundException e) { 
      e.printStackTrace(); 
     } 
     return version; 
    } 

    public static boolean checkClientApiVer(String clientApiVer){ 

     int s = RPCCommunicator.strVerToIntVer(clientApiVer); 
     int c = RPCCommunicator.strVerToIntVer(getPackageVersion()); 

     return (c>=s); 
    } 

    public boolean execute() { 

     serverApiVer = jsonObj.getString("server_api_ver"); 
     Log.w("SERVER API VER","SHOW SERVER API VERSION : "+serverApiVer); 

      checkClientApiVer(serverApiVer); 
} 

}

,它說空指針例外這一行:

PackageManager pm = context.getPackageManager(); 

其實我不能使用this.getPackageManager(),或者TestActivity.getPackageManager()我不能設置contextthis

有什麼建議嗎?

+0

你有想過嗎?剛剛得到同樣的行爲。 (答案令人驚訝地沒用) –

回答

2

問題是您聲明瞭上下文,但從未實例化或分配給它的引用。所以它指向null。

通常,TestActivity應該是Activity類的一個子類或類似的東西。

在這種情況下,你可以不喜歡

this.getPackageManager(); 
2

則應該通過添加類的構造函數是不是一個活動來初始化你的背景下,

public TestActivity(Context c) { 
    this.context = c; 
} 

,並在你的活動,通過發送this作爲這樣的參數來實例化TestActivity

TestActivity tActivity = new TestActivity(this);//this refer to the Activity 

第二種解決方案是通過擴展活動,你應該覆蓋方法onCreate()

3

@Roflcoptr指出,基本的,但實際上,你的類不延長活性,所以它不是一個背景下,變化它到:

public class TestActivity extends Activity 

如果你想要它是一個實際的活動,或者如果它應該只是一個輔助類,當它被實例化時將它傳遞給活動。

+0

其實我忘了提及並補充說我的TestActivity已經擴展了一個自定義類。它只是一個幫助類,而不是活動 –

+0

如果你的類不是一個活動,那麼你應該把上下文傳遞給你在我的答案中描述的構造函數中的類 – Houcine

+0

實際上它仍然沒有幫助 –

3

如果您的課程是一項活動,最好將其用作上下文。如果你需要另一個類的上下文,你可以在你的applicationContext上有一個單例指針。

public class MyApp extends Application { 

    private static MyApp instance; 

    public MyApp() { 
     instance = this; 
    } 

    public static Context getContext() { 
     return instance; 
    } 
} 

,並在您的清單文件:

<application 
    android:name="com.mycompany.appname.MyApp" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name"> 

現在你可以總是有

MyApp.GetContext(); 
1

,而不是在課堂上創設情境對象,並保持活動或應用領先的參考上下文在android bcz中的內存泄漏你不創建任何特定類的任何對象。

您可以通過下面這樣做實現這一步驟

1>創建單獨的類應用程序上下文和清單定義應用程序類。xml;因此它們將成爲整個應用程序生命週期中的一個上下文對象。

2>傳遞上下文,當您使用該方法時。

public static String getPackageVersion(Context context){ 
    try { 
     PackageManager pm = context.getPackageManager(); 
     PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0); 
     version = packageInfo.versionName; 
    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return version; 
}