Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java contextWrapper.getResources()的空指针异常?使用自定义侦听器时_Java_Android_Multithreading_Observer Pattern - Fatal编程技术网

Java contextWrapper.getResources()的空指针异常?使用自定义侦听器时

Java contextWrapper.getResources()的空指针异常?使用自定义侦听器时,java,android,multithreading,observer-pattern,Java,Android,Multithreading,Observer Pattern,对于我以前实现过的常见类型的自定义侦听器,获取一个奇怪的空指针异常,没有任何问题 如果我在与活动的主用户界面线程通信的回调方法中放入任何代码,就会发生崩溃。如果我在这个方法中放置了任何不接触用户界面线程的代码,那么就不会发生崩溃。这没有意义,因为此类中的所有代码都在UI线程上运行,不需要使用处理程序或runonui方法 如何解决此问题 从logcat: 09-30 10:55:15.360: E/AndroidRuntime(2207): FATAL EXCEPTION: main 09-30

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

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

如何解决此问题

从logcat:

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)
立即创建

 listener = new StartActivity();
listener是此活动类中作为嵌套子类的接口

 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=newstartactivity()。您已经手动创建了活动,这就是为什么它没有附加的上下文,并且无法与ui线程交互。您可以将StartActivity引用传递给同步器

我认为问题在于listener=newstartactivity()。您已经手动创建了Activity,这就是为什么它没有附加的上下文并且无法与ui线程交互。您放置代码的方式很难遵循完整的执行路径。这看起来像是原因,我如何修复它?如果我不能像java类一样实例化新的StartActivity(),在androidPass StartActivity中引用同步器。是的!!!!!!现在可以了。这是正确的答案,我通过将StartActivity.this传递给另一个活动来修复它,并实例化了侦听器,将其作为值传递给侦听器变量,如下所示,listener=(OnResultReturnedListener)activity,感谢您的帮助。我不确定将一个活动传递给另一个活动是否是最好的选择,但如果没有代码,我不能肯定。在这种情况下,我认为内存泄漏不是问题。如果这是一个问题,那么我将使用WeakReference
 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;
    }
 }