Search code examples
androidalgoliainstantsearchinstantsearch-android

MemoryLeak appears when using InstantSearch-Android


When I'm using InstantSearch Android, a memory leak appears.

See the following MainActivity which leaks memory... hprof shows that it is a problem with com.algolia.instantsearch.ui.views.Hits. Does anybody know how to destroy that View when the Activity get destroyed?

public class MainActivity extends AppCompatActivity {
    private Searcher searcher;
    InstantSearch helper;

    Hits hits;

    LinearLayout activity_main;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        hits= (Hits) findViewById(R.id.hits);
        activity_main= (LinearLayout) findViewById(R.id.activity_main);

        searcher = Searcher.create("app_id","secret_key","Items");
        helper = new InstantSearch(this, searcher);
        helper.search();
    }

    @Override
    protected void onDestroy() {
        searcher=null;

        helper=null;
        hits.clear();

        hits.removeAllViewsInLayout();
        hits.removeAllViews();
        hits.destroyDrawingCache();
        hits.setBackground(null);
        hits.setBackgroundResource(0);
        hits=null;

        activity_main.removeAllViewsInLayout();
        activity_main.removeAllViews();
        activity_main.destroyDrawingCache();
        activity_main.setBackground(null);
        activity_main.setBackgroundResource(0);
        activity_main=null;
        Log.i("AppInfo","Destroy");
        super.onDestroy();
    }
}

here is my activity_main.xml:

<LinearLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white"
xmlns:algolia="http://schemas.android.com/apk/res-auto">


<com.algolia.instantsearch.ui.views.Hits
    android:id="@+id/hits"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    algolia:itemLayout="@layout/hits_item"
    algolia:autoHideKeyboard="true"
    algolia:hitsPerPage="20"/>

here is my hits_item.xml:

<layout xmlns:algolia="http://schemas.android.com/apk/res-auto">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/profImg"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:src="@drawable/placeholder_video"
            algolia:attribute='@{"profilePic"}'/>

    <TextView
        android:id="@+id/hit_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        algolia:attribute='@{"name"}'
        algolia:highlighted='@{true}'/>

 </RelativeLayout>


Solution

  • We just release a fix. If you update to 1.1.4 you can now fix the issue. Just add your activity's onDestroy the following code:

    @Override
    protected void onDestroy() {
        // ... your code ...
        searcher.destroy(); // This will clean and release different listeners 
        super.onDestroy();
    }
    

    You can see it here