marinat / tree-view-list-android

Automatically exported from code.google.com/p/tree-view-list-android
BSD 2-Clause "Simplified" License
0 stars 0 forks source link

NPE on restoring app after process kill #37

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. set up emulator
   a. limit processes to 1
   b. immediate destroy activities
2. fire project to show sample with tree
3. minimize app [press home]
4. maximize

Now app throws NPE [attached to end of issue]

Tested on emulator with Android 4.0.3

Stacktrace with NPE:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{pl.polidea.treeview/pl.polidea.treeview.demo.TreeViewListDemo}: 
java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    at android.app.ActivityThread.access$600(ActivityThread.java:123)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4424)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at pl.polidea.treeview.InMemoryTreeStateManager.registerDataSetObserver(InMemoryTreeStateManager.java:315)
    at pl.polidea.treeview.AbstractTreeViewAdapter.registerDataSetObserver(AbstractTreeViewAdapter.java:100)
    at android.widget.ListView.setAdapter(ListView.java:464)
    at pl.polidea.treeview.TreeViewList.setAdapter(TreeViewList.java:92)
    at pl.polidea.treeview.demo.TreeViewListDemo.setTreeAdapter(TreeViewListDemo.java:93)
    at pl.polidea.treeview.demo.TreeViewListDemo.onCreate(TreeViewListDemo.java:76)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

Original issue reported on code.google.com by gtra...@gmail.com on 4 Jul 2013 at 9:46

GoogleCodeExporter commented 9 years ago
It's only a demo problem - on some android versions. I think I fixed it (added 
protection against Null values from savedBundleInstance).

Original comment by ja...@potiuk.com on 4 Jul 2013 at 4:05

GoogleCodeExporter commented 9 years ago
Thanks for help. Unfortunately fix doesn't work.
Still the same NPE.

Caused by: java.lang.NullPointerException
    at pl.polidea.treeview.InMemoryTreeStateManager.registerDataSetObserver(InMemoryTreeStateManager.java:315)
    at pl.polidea.treeview.AbstractTreeViewAdapter.registerDataSetObserver(AbstractTreeViewAdapter.java:100)
    at android.widget.ListView.setAdapter(ListView.java:464)
    at pl.polidea.treeview.TreeViewList.setAdapter(TreeViewList.java:92)
    at pl.polidea.treeview.demo.TreeViewListDemo.setTreeAdapter(TreeViewListDemo.java:99)
    at pl.polidea.treeview.demo.TreeViewListDemo.onCreate(TreeViewListDemo.java:82)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    ... 11 more

Original comment by gtra...@gmail.com on 5 Jul 2013 at 8:18

GoogleCodeExporter commented 9 years ago
I agree with #2, the issue is not fixed yet. I experienced the same on my 4.4.2 
device with "Don't keep activities" enabled. 

The problem is the declaration of "private transient Set<DataSetObserver> 
observers". Since  the object is transient it will not be serialized when the 
activity is killed and therefore it will be null when the activity is recreated.

I fixed it quick and dirty by changing the declaration to (no initialization 
here)
private transient Set<DataSetObserver> observers;

Then I initialize the object in the methods registerDataSetObserver and 
unregisterDataSetObserver:
if (observers == null) observers = new HashSet<DataSetObserver>();

This fixed the issue for me, however, this is a quite dirty approach. Comments 
welcome.

Original comment by qlx...@gmail.com on 17 Jun 2014 at 9:42