Android 在构造函数中传递上下文

Android 在构造函数中传递上下文,android,Android,除了我在这里开始的线程之外 好的,首先我将上下文直接传递给listToTextFile函数,它工作得很好。之后,我决定将上下文作为参数传递给GenerateXml类的构造函数,如下所示: public GenerateXml(Context cntx){ this.cntx = cntx; } 我又得到了NullPointerException。 调试时,我可以看到构造函数中的赋值无效,并且this.cntx实际上为NULL 主活动调用GenerateXml代

除了我在这里开始的线程之外

好的,首先我将上下文直接传递给listToTextFile函数,它工作得很好。之后,我决定将上下文作为参数传递给GenerateXml类的构造函数,如下所示:

    public GenerateXml(Context cntx){

        this.cntx = cntx;
    }
我又得到了NullPointerException。 调试时,我可以看到构造函数中的赋值无效,并且this.cntx实际上为NULL

主活动调用GenerateXml代码:

private void parseAppListToXML(List<ApplicationInfo> packages) {
        // TODO Auto-generated method stub
        GenerateXml gXml = new GenerateXml(getApplicationContext());
        gXml.listToXml();
    }
LogCat显示NullPointerException-可能是因为this.cntx为Null:

04-20 11:20:17.580: E/AndroidRuntime(368): FATAL EXCEPTION: main
04-20 11:20:17.580: E/AndroidRuntime(368): java.lang.NullPointerException
04-20 11:20:17.580: E/AndroidRuntime(368):  at com.example.tester.GenerateXml.<init>(GenerateXml.java:32)
04-20 11:20:17.580: E/AndroidRuntime(368):  at com.example.tester.MainActivity$1.parseAppListToXML(MainActivity.java:80)
04-20 11:20:17.580: E/AndroidRuntime(368):  at com.example.tester.MainActivity$1.onClick(MainActivity.java:62)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.view.View.performClick(View.java:2408)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.view.View$PerformClick.run(View.java:8816)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.os.Handler.handleCallback(Handler.java:587)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.os.Looper.loop(Looper.java:123)
04-20 11:20:17.580: E/AndroidRuntime(368):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-20 11:20:17.580: E/AndroidRuntime(368):  at java.lang.reflect.Method.invokeNative(Native Method)
04-20 11:20:17.580: E/AndroidRuntime(368):  at java.lang.reflect.Method.invoke(Method.java:521)
04-20 11:20:17.580: E/AndroidRuntime(368):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-20 11:20:17.580: E/AndroidRuntime(368):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-20 11:20:17.580: E/AndroidRuntime(368):  at dalvik.system.NativeStart.main(Native Method)
类别:

package com.example.tester;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;
import java.util.ListIterator;

import android.content.Context;
import android.content.pm.ApplicationInfo;
//import android.util.Xml;
import android.content.pm.PackageManager;

public class GenerateXml  {




//
// Attributes
//

protected Context cntx;

//Constructor gets caller Context

    public GenerateXml(Context cntx){

        this.cntx = cntx;
    }

final PackageManager pm = cntx.getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);


public void listToXml() {

    // break List into array so late will print one line at a time to the file
    ListIterator<ApplicationInfo> iter = packages.listIterator();

    try { // catches IOException below

         FileOutputStream fOut =  cntx.openFileOutput("AppsList.XML",Context.MODE_PRIVATE);

         OutputStreamWriter osw = new OutputStreamWriter(fOut); 
         osw.write("<INSTALLED_APPS_LIST>");
         while (iter.hasNext()) {
         // Write the string to the file

             osw.write("<APPLICATION>");
             osw.write("<PACKAGE>");
             osw.write(iter.next().toString());
             osw.write("</PACKAGE>");
            // osw.write(iter.);
             osw.write("</APPLICATION>");
             osw.write('\n');
         /* ensure that everything is
          * really written out and close */
         }
         osw.write("</INSTALLED_APPS_LIST>");

         osw.flush();
         osw.close();
     }catch (IOException e){
         //Log.e(TAG,"could not open file out stream", e); 
     }
}
}


在运行构造函数之前初始化成员变量,并且只在构造函数中初始化cntx。因此,NPE。将这些初始化也移动到构造函数。

请发布logcat错误,并发布传递上下文到GenerateXml的行您是否有新的GenerateXmlActivityName。此??公共类GenerateXml扩展了活动{是一个活动类。为什么需要一个将上下文作为参数的构造函数。这是错误的。laalto已经在您发布的链接中回答了您的问题1。向post添加了代码和locat。2.GenerateXml不是活动。我更改了它。。
final PackageManager pm = cntx.getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);