NPE в приложении с удаленным сервисом на некоторых устройствах (для конкретного рынка?) - PullRequest
0 голосов
/ 18 марта 2011

У меня есть два приложения: первое - это удаленный сервис.Это манифест:

<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 и на моем рутированном HTC Hero с Cyanogen 7 (Android 2.3.2).

НО он выдает следующее исключение в 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 Ответ

1 голос
/ 24 марта 2011

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 выполняются без надлежащих данных.

Поскольку телефоны не имеют рута, вы можете собирать журналы с телефона, не подключенного к вашему ПК, используяприложение Log Collector (доступно с маркета), которое позволяет вам отправлять журналы своего телефона себе по электронной почте или другим способом.

Удачи

...