【问题标题】:How to get context in android Service class如何在android服务类中获取上下文
【发布时间】:2011-10-01 11:23:16
【问题描述】:

当我尝试将 XML 文件从内存中读取到对象中时出现以下错误。获取上下文似乎有问题。谁能告诉我我的代码有什么问题?

代码:

public class WifiScanning extends Service {

private static final String TAG = "WifiScanning";
private Timer timer;
public int refreshRate;

public WifiScanning() {
    super();
    Configuration config = new Configuration();
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    SAXParser sp;
    XMLReader xr = null; 
    DataHandler dataHandler = null;
    try {
        sp = spf.newSAXParser();
        xr = sp.getXMLReader();
        dataHandler = new DataHandler(); 
        xr.setContentHandler(dataHandler); 


        xr.parse(new InputSource(this.openFileInput("config.xml")));
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    config = dataHandler.getConfig();
    refreshRate = Integer.parseInt(config.getMapRefreshRate());
    // TODO Auto-generated constructor stub
}

private TimerTask updateTask = new TimerTask() {
    @Override
    public void run() {
        Log.i(TAG, "Timer task doing work");
    }
};

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "Service creating");

    timer = new Timer("TweetCollectorTimer");
    Log.i(TAG, "Refresh Rate: "+ String.valueOf(refreshRate));
    timer.schedule(updateTask, 0, 3000L);

}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "Service destroying");

    if (timer != null){
        timer.cancel();
        timer.purge();
        timer = null;
    }
}

public void onStop() {
    Log.i(TAG, "Service destroying");
    if (timer != null){
        timer.cancel();
        timer.purge();
        timer = null;
    }
}
}

LogCat:

10-01 11:08:49.804: ERROR/AndroidRuntime(21514): java.lang.RuntimeException: Unable to instantiate service android.wps.WifiScanning: java.lang.NullPointerException
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2764)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.app.ActivityThread.access$3200(ActivityThread.java:119)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1917)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.os.Looper.loop(Looper.java:123)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.app.ActivityThread.main(ActivityThread.java:4363)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at java.lang.reflect.Method.invokeNative(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at java.lang.reflect.Method.invoke(Method.java:521)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at dalvik.system.NativeStart.main(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514): Caused by: java.lang.NullPointerException
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.content.ContextWrapper.openFileInput(ContextWrapper.java:152)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.wps.WifiScanning.<init>(WifiScanning.java:52)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at java.lang.Class.newInstanceImpl(Native Method)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at java.lang.Class.newInstance(Class.java:1479)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2761)
10-01 11:08:49.804: ERROR/AndroidRuntime(21514):     ... 10 more

【问题讨论】:

  • 您尝试过 IntentService。它更容易处理。顺便说一句,服务扩展了上下文。
  • 但是这个类可以从内存中读取文件吗?

标签: android android-service


【解决方案1】:

您不应在构造函数中执行此操作,而应仅在(包括)onCreate() 和 onDestroy() 之间执行此操作。

【讨论】:

  • 你的意思是检索xml文件的编码部分应该在onCreate()和onDestroy()之间?
  • 我的意思是,对于 Android 系统,Activities 和 Services 不是在调用构造函数和垃圾收集之间存在,而是它们的存在从调用 onCreate() 开始,并在调用 onDestroy() 之后结束。我的意思是,在 onDestroy() 之前,您可以在方法 onCreate() 或更高版本中与服务进行任何操作/交互。服务的构造函数在 onCreate() 之前调用。
  • 谢谢你告诉我。在我将构造函数中的代码转移到 onCreat() 之后,我的代码就可以工作了。
  • 另外,您可以在 onBind()、onStart()、onUnbind()(虽然我无法想象这种情况)、onRebind() 或任何其他中读取 XML 文件、加载声音等方法(也是自制的)发生在 onCreate() 之后。例如,我与服务绑定,绑定后我调用自制方法 loadSounds() - 上下文不为空,所以服务工作。
【解决方案2】:

如果您使用的是服务,您应该在onStartCommand 中编写该代码,而不是在构造函数中

【讨论】:

  • 启动服务(new Intent(getBaseContext(), WifiScanning.class));和 onStartCommand 有关系吗?
  • 是的。每次客户端使用 startService() 显式启动服务时,系统都会调用 onStartCommand()
  • 所以你的意思是当客户端显式启动服务时,我可以从传递给服务的意图中检索上下文?
  • 不,因为 Intent 存在于上下文之外。为什么需要上下文? WifiScanning.java 的第 52 行是什么?
  • 因为我需要它从我存储在内存中的 XML 中读取数据。第 52 行,public void onCreate()?
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多