在某些设备上具有远程服务的应用程序中的NPE(特定于市场?)

时间:2011-03-18 11:32:12

标签: android ipc google-play parcel

我有两个应用程序:第一个是远程服务。它的表现是:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mecom.framework"
      android:versionCode="1"
      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

            <activity android:name="SettingsActiviry"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

         <service android:name=".ParserService"
                  android:process=":remote"
                  android:enabled="true"
                  android:exported="true">
            <intent-filter>
                <action android:name="com.mecom.framework.parser.interfaces.Parser" />
                <action android:name="com.mecom.framework.PARSE" />
                <category android:name="com.mecom.framework.PARSE" />
            </intent-filter>
        </service>

    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

</manifest>

第二个绑定到此服务并执行方法。它显而易见:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mecom.berlingske"
      android:versionCode="1"
      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.Light">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name"
                  android:theme="@style/BerlingskeMainTheme"
                  android:configChanges="keyboard|keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ArticleActivity"
                  android:label="@string/article"
                  android:theme="@style/BerlingskeMainTheme"
                  android:configChanges="keyboard|keyboardHidden|orientation"/>
    </application>

</manifest>

现在奇怪的是,这些应用程序在使用Android 2.1的模拟器和使用Cyanogen 7(Android 2.3.2)的HTC Hero上完美运行。

但是它会在HTC Desire HD和Nexus S上抛出以下异常(两者都没有根源):

W/dalvikvm( 2990): threadid=8: thread exiting with uncaught exception (group=0x40025a70)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990): FATAL EXCEPTION: AsyncTask #1
03-18 13:19:04.051: ERROR/AndroidRuntime(2990): java.lang.RuntimeException: An error occured while executing doInBackground()
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.lang.Thread.run(Thread.java:1102)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990): Caused by: java.lang.NullPointerException
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.Parcel.readException(Parcel.java:1253)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.Parcel.readException(Parcel.java:1235)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at com.mecom.framework.parser.interfaces.Parser$Stub$Proxy.getArticlesList(Parser.java:174)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at com.mecom.berlingske.NewsListActivity$AsyncGetArticlesTask.doInBackground(NewsListActivity.java:139)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at com.mecom.berlingske.NewsListActivity$AsyncGetArticlesTask.doInBackground(NewsListActivity.java:1)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     ... 4 more

我可以提供更多代码(例如AsyncTask的实现),但事实上,这个代码实际上在至少两种情况下工作让我想知道,这里可能有什么问题。有什么想法吗?

UPD:刚刚在该设备上安装了我的其他使用IPC的应用程序,同样的问题。从市场安装 - 工作正常。签下我当前的应用程序,并重新安装它。没有帮助。对我的其他应用程序做了同样的事情 - 也没有帮助。在该设备上测试我的应用程序的唯一方法是将其部署到市场吗?

1 个答案:

答案 0 :(得分:1)

NPE是由于您正在进行带有缺失数据的IPC调用而引起的。日志中的这些行显而易见:

03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.Parcel.readException(Parcel.java:1253)
03-18 13:19:04.051: ERROR/AndroidRuntime(2990):     at android.os.Parcel.readException(Parcel.java:1235)

要解决问题,请在每次进行IPC调用之前输入日志语句,然后将该调用的参数输出到日志中。这将使您能够确定何时,何地以及希望在没有适当数据的情况下进行这些IPC调用的原因。

由于手机未植根,您可以使用应用程序日志收集器(可从市场上购买)从未连接到PC的手机收集日志,这样您就可以通过电子邮件或其他方式将手机的日志发送给自己。

祝你好运