代码之家  ›  专栏  ›  技术社区  ›  Fat Monk

onPostExecute中的空指针异常

  •  2
  • Fat Monk  · 技术社区  · 7 年前

    正如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

    代码运行良好,只报告了一次崩溃。

    onPostExecute 非常简单(包括源代码行号):

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

    ( shortURLreturn

    1 回复  |  直到 7 年前
        1
  •  1
  •   mihanovak1024    7 年前

    没有太多的代码发布,所以大部分都是猜测。

    link . 比如:

    @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。

    对于我的第二点,请记住onPostExecute发生在不同于MainActivity(UiThread)的线程(IO/后台线程)上,如果您在之后执行任何应该在主线程或线程安全(变量设置应该是线程安全的;如果您不是,请尝试使用锁,例如:

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