【问题标题】:null pointer exception for contextWrapper.getResources()? when using custom listenercontextWrapper.getResources() 的空指针异常?使用自定义监听器时
【发布时间】:2013-09-30 02:33:20
【问题描述】:

为我之前实现的一种常见类型的自定义侦听器获取一个奇怪的空指针异常,没有任何问题。

如果我将任何代码放入与活动的主用户界面线程通信的回调方法中,就会发生崩溃。如果我在此方法中放入任何不触及用户界面线程的代码,则不会发生崩溃。它没有意义,因为这个类中的所有代码都运行在 UI 线程上,不需要使用处理程序或 runonui 方法。

我该如何解决这个问题?

来自日志猫:

09-30 10:55:15.360: E/AndroidRuntime(2207): FATAL EXCEPTION: main
09-30 10:55:15.360: E/AndroidRuntime(2207): java.lang.NullPointerException
09-30 10:55:15.360: E/AndroidRuntime(2207):     at 
android.content.ContextWrapper.getResources(ContextWrapper.java:81)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at android.widget.Toast.<init>(Toast.java:92)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at android.widget.Toast.makeText(Toast.java:233)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at StartActivity.onResultReturned(StartActivity.java:124)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at jp.co.forever.tankinspectionsystem.Synchronizer.sendInt(Synchronizer.java:215)
09-30 10:55:15.360: E/AndroidRuntime(2207):     at 
jp.co.forever.tankinspectionsystem.Synchronizer$SendOutMsgAndPack$2.run(Synchronizer.java:162)

StartActivity类中监听器的代码,这是一个不扩展activity的工具类,这里的所有代码都运行在一个独立于UI线程的新线程run方法中

在类变量声明中

 public OnResultReturnedListener listener;

在创建时

 listener = new StartActivity();

监听器是一个接口,作为该活动类中的嵌套子类

 public interface OnResultReturnedListener {
public void  onResultReturned(int result);
 }

实现监听器的其他类中的代码,所有代码都运行在 UI 主线程上,没有创建额外的线程

 public class StartActivity extends Activity
 implements Synchronizer.OnResultReturnedListener {

 // method onResultReturned is override for custom listerner class
 // OnResultReturnedListener interface inside of the Synchronizer class

    @Override
public void onResultReturned(int result) {

    // toast like this or any other method that touched the
    // UI thread will result in a crash
Toast.makeText(StartActivity.this, "value returned "
    + result , Toast.LENGTH_SHORT).show();


    // putting the Toast in a handler will not help, still results in crash
    handler.post(new Runnable() {
        @Override
        public void run() {
        Toast.makeText(StartActivity.this, "value returned "
                    + result, Toast.LENGTH_SHORT).show();
        }
        });

    //adding a handler.post to the other class, Synchronizer,
    // that the method call comes from
    // will not help and still causes crashes, for example
    //handler.post(new Runnable() {
    //@Override
    //public void run() {
    //fileTransferStatus = 1;
    //        listener.onResultReturned(fileTransferStatus);
    //   }
    //});

    // this statement will not cause crash
    int x = 13;
    }
 }

【问题讨论】:

  • 我相信问题出在 listener = new StartActivity() 上。您手动创建了 activivty,这就是它没有附加上下文并且无法与 ui 线程交互的原因。
  • 你放置代码的方式很难遵循完整的执行路径。
  • 这似乎是原因,我该如何解决这个问题?如果我在 android 中不能像 java 类一样实例化 new StartActivity()
  • 将 StartActivity 引用传递给您的同步器。
  • 是的!!!!!!现在可以了。这就是答案

标签: java android multithreading observer-pattern


【解决方案1】:

我相信问题出在 listener = new StartActivity() 中。您手动创建了活动,这就是它没有附加上下文并且无法与 ui 线程交互的原因。您可以将 StartActivity 引用传递给您的 Synchronizer。

【讨论】:

  • 这是正确的,我通过将参数中的 StartActivity.this 传递给其他活动并实例化侦听器将其作为值传递给侦听器变量,例如 listener = (OnResultReturnedListener) 活动,谢谢你的帮助。
  • 我不确定将一项活动传递给另一项活动是否是最好的选择)但如果没有代码,我无法确定。
  • 在这种情况下,我认为内存泄漏不是问题。如果这是一个问题,那么我将使用 Wea​​kReference
猜你喜欢
  • 2013-02-08
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多