исключение нулевого указателя в onPostExecute - PullRequest
0 голосов
/ 12 ноября 2018

Я понятия не имею, как решить, где происходит исключение нулевого указателя.

Авария произошла только один раз (пока) на физическом устройстве пользователя, как рекомендовано Google Play - я не знаюсмог воспроизвести его в среде отладки.

Трассировка стека, которую Google Play дает мне, кажется немного расплывчатой ​​(несмотря на то, что я загрузил файл сопоставления для релиза):

java.lang.NullPointerException: 
  at com.nooriginalthought.amalfi.getShortURL.a (getShortURL.java:11)
  at com.nooriginalthought.amalfi.getShortURL.onPostExecute (getShortURL.java:2)
  at android.os.AsyncTask.finish (AsyncTask.java:695)
  at android.os.AsyncTask.access$600 (AsyncTask.java:180)
  at android.os.AsyncTask$InternalHandler.handleMessage (AsyncTask.java:712)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:193)
  at android.app.ActivityThread.main (ActivityThread.java:6806)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:873)

Все, что я могу видеть, это то, что исключение, похоже, генерируется функцией onPostExecute в моем классе getShortURL (это асинхронная задача, которая вызывает битый API).

Код работает нормально и толькосообщалось об одном сбое.

Код в onPostExecute очень прост (включая номера строк исходного кода):

1320    @Override
1321    protected void onPostExecute(String shortURL) {
1322        super.onPostExecute(shortURL);
1323        mainActivityWeakReference.get().shortURLreturn(shortURL);
1324    }

(shortURLreturn определено в моем классе MainActivity)

Как узнать, что на самом деле выкинуло эту ошибку?

1 Ответ

0 голосов
/ 12 ноября 2018

Не так много кода отправлено, так что в основном будет угадывать.

Как вы уверены, что mainActivityWeakReference не является нулевым, так как это слабая ссылка?Проверьте эту ссылку о том, как использовать слабые справочные действия ссылка .Что-то вроде:

@Override
protected void onPostExecute(String shortURL) {
  MainActivity mainActivity = mainActivityWeakReference.get();
  if (mainActivity != null) {
     mainActivity.shortURLreturn(shortURL);
  }
}

Кроме того, для такого рода действий вам на самом деле не нужна слабая ссылка на действие (конечно, только если вам не нужны какие-либо методы, которые на самом деле принадлежатAndroid Activity класс).Если вам нужны только ваши публичные методы, которые вы реализовали в MainActivity, вы можете создать интерфейс, например:

interface ShortUrlReceiveCallback {
   void onReceive(String shortURL);
}

, и тогда вы просто сохраните эту ссылку в конструкторе класса getShortURL (примечаниечто классы начинаются с заглавной буквы), а затем при вызове onPostExecute -> shortUrlReceiveCallback.onReceive (shortURL);и пусть ваша MainActivity реализует этот ShortActivityCallback.

Для моего 2-го момента, имейте в виду, что onPostExecute происходит в другом потоке (IO / фоновый поток), чем MainActivity (UiThread), если впоследствии вы делаете что-то, что должнобыть в главном потоке или поточно-безопасным (установка переменных должна быть поточно-ориентированной; попробуйте использовать блокировки, если вы, например, не:

class MainActivity {
   private String mainShortUrl;
   private Lock urlReturnLock = new ReentrantLock();
   ...
   public void shortURLReturn(String shortUrl) {
      urlReturnLock.lock();
      try {
         mainShortUrl = shortUrl;
      } finally {
         urlReturnLock.unlock();
      }
   }
}
...