0

My app works when initially run, however if it is left in the background for a while then relaunched by the user I get a RuntimeException "Unable to start activity ComponentInfo...Error inflating class fragment".

The activity contains a fragment that contains a ListView. The ListView has a custom adapter that contains an ImageView and two TextViews.

When returning to the activity after the app has been in the background and many other apps are used the error is thrown, which leads me to believe its a memory issue, since this does not happen with the emulator only on my device.

How can I make my app avoid this exception?

Here is the LogCat after I resume the app after a long time in the background:

06-15 18:48:41.886: E/AndroidRuntime(10033): FATAL EXCEPTION: main
06-15 18:48:41.886: E/AndroidRuntime(10033): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.scl.tntmg/com.scl.tntmg.NowShowingActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.os.Looper.loop(Looper.java:137)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread.main(ActivityThread.java:4424)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at java.lang.reflect.Method.invokeNative(Native Method)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at java.lang.reflect.Method.invoke(Method.java:511)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at dalvik.system.NativeStart.main(Native Method)
06-15 18:48:41.886: E/AndroidRuntime(10033): Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.Activity.setContentView(Activity.java:1835)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.scl.tntmg.NowShowingActivity.onCreate(NowShowingActivity.java:16)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.Activity.performCreate(Activity.java:4465)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-15 18:48:41.886: E/AndroidRuntime(10033):    ... 11 more
06-15 18:48:41.886: E/AndroidRuntime(10033): Caused by: android.os.NetworkOnMainThreadException
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at java.net.InetAddress.getAllByName(InetAddress.java:220)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.scl.tntmg.util.MovieGuideUtil.getData(MovieGuideUtil.java:118)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.scl.tntmg.util.MovieGuideUtil.refreshMovies(MovieGuideUtil.java:183)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.scl.tntmg.util.MovieGuideUtil.getMovies(MovieGuideUtil.java:82)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at com.scl.tntmg.ListFrag.onCreateView(ListFrag.java:49)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:845)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1058)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:289)
06-15 18:48:41.886: E/AndroidRuntime(10033):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
06-15 18:48:41.886: E/AndroidRuntime(10033):    ... 21 more

Here is the activity:

public class NowShowingActivity extends FragmentActivity{

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nowshowing);

    removeNotifications();
}

public void onRestart(){
    super.onRestart();
}

public void onStop(){
    super.onStop();
}

public void onDestroy(){
    super.onDestroy();
}

public void onResume(){
    super.onResume();
    removeNotifications();
}

private void removeNotifications(){
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    mNotificationManager.cancel(1);
}

public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.mgoptions,menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent;
    switch(item.getItemId()){
        case R.id.theater_details:
            myIntent = new Intent(this, TheaterActivity.class);
            this.startActivity(myIntent);
            return true;
        case R.id.refresh:
            myIntent = new Intent(this, HomeActivity.class);
            this.startActivity(myIntent);
            return true;
        case R.id.about:
            myIntent = new Intent(this, AboutActivity.class);
            this.startActivity(myIntent);
            return true;
        case R.id.settings:
            myIntent = new Intent(this, SettingActivity.class);
            this.startActivity(myIntent);
            return true;
        default:
            return super.onOptionsItemSelected(item);   
    }
}

Here is the nowshowing layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >



<fragment class="com.scl.tntmg.ListFrag"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="0dp" android:layout_height="fill_parent" >
    <!-- Preview: layout=@layout/list -->
</fragment>

</LinearLayout>
Arthur Thompson
  • 9,087
  • 4
  • 29
  • 33

2 Answers2

2

Your stack trace says

Caused by: android.os.NetworkOnMainThreadException

which means that maybe the first time, you access network in the right thread, but after resuming the second time, the network is accessed from the UI thread, like here:

at com.scl.tntmg.util.MovieGuideUtil.getData(MovieGuideUtil.java:118)
Christine
  • 5,617
  • 4
  • 38
  • 61
  • This is correct, thank you very much. I was reading the logcat incorrect, thinking that the first error was the one to pay attention to. I will be more vigilant next time. – Arthur Thompson Jun 16 '12 at 23:03
0

As you say it will be a memory issue, when your application looses focus android may or may not (depends on the availability of resources) release memory used by your application. As such you should save the state of your activity in an onPause() function, you can then restore this in the onResume() function.

melodiouscode
  • 2,105
  • 1
  • 20
  • 41