Исключение Realm Android произошло во время выполнения фильтрации ()!

Приложение работало нормально, когда я использовал Spinner. Но когда я попробовал AutoComplete Textview вместо Spinner, ничего не отображается, когда я печатаю на нем. Любая помощь приветствуется.

Логкат Предупреждение:

08-23 14:01:13.485 9542-9542/com.vyshnav.realmexample W/art: Failed to find OatDexFile for DexFile /data/data/com.vyshnav.realmexample/files/instant-run/dex/slice-slice_9-classes.dex ( canonical path /data/data/com.vyshnav.realmexample/files/instant-run/dex/slice-slice_9-classes.dex) with checksum 0x0486ffcc in OatFile /data/data/com.vyshnav.realmexample/cache/slice-slice_9-classes.dex
08-23 14:01:14.237 9542-9542/com.vyshnav.realmexample W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-23 14:01:14.769 9542-9595/com.vyshnav.realmexample E/GED: Failed to get GED Log Buf, err(0)
08-23 14:01:14.839 9542-9595/com.vyshnav.realmexample W/MALI: glDrawArrays:714: [MALI] glDrawArrays takes more than 5ms here. Total elapse time(us): 12482
08-23 14:01:20.502 9542-9668/com.vyshnav.realmexample W/Filter: An exception occured during performFiltering()!
                                                            java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
                                                                at io.realm.BaseRealm.checkIfValid(BaseRealm.java:449)
                                                                at io.realm.RealmResults.isLoaded(RealmResults.java:872)
                                                                at io.realm.RealmResults.size(RealmResults.java:372)
                                                                at java.util.AbstractCollection.toArrayList(AbstractCollection.java:348)
                                                                at java.util.AbstractCollection.toArray(AbstractCollection.java:339)
                                                                at java.util.ArrayList.<init>(ArrayList.java:97)
                                                                at android.widget.ArrayAdapter$ArrayFilter.performFiltering(ArrayAdapter.java:456)
                                                                at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
                                                                at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                at android.os.Looper.loop(Looper.java:194)
                                                                at android.os.HandlerThread.run(HandlerThread.java:61)
08-23 14:01:35.351 9542-9811/com.vyshnav.realmexample W/Filter: An exception occured during performFiltering()!
                                                            java.lang.NullPointerException: collection == null
                                                                at java.util.ArrayList.<init>(ArrayList.java:94)
                                                                at android.widget.ArrayAdapter$ArrayFilter.performFiltering(ArrayAdapter.java:456)
                                                                at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
                                                                at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                at android.os.Looper.loop(Looper.java:194)
                                                                at android.os.HandlerThread.run(HandlerThread.java:61)
08-23 14:01:44.516 9542-9899/com.vyshnav.realmexample W/Filter: An exception occured during performFiltering()!
                                                            java.lang.NullPointerException: collection == null
                                                                at java.util.ArrayList.<init>(ArrayList.java:94)
                                                                at android.widget.ArrayAdapter$ArrayFilter.performFiltering(ArrayAdapter.java:456)
                                                                at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
                                                                at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                at android.os.Looper.loop(Looper.java:194)
                                                                at android.os.HandlerThread.run(HandlerThread.java:61)

МинАктивити.java:

package com.vyshnav.realmexample;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Spinner;

import io.realm.Realm;
import io.realm.RealmChangeListener;
import io.realm.RealmConfiguration;
import io.realm.RealmResults;
public class MainActivity extends AppCompatActivity {

private Realm realm;
private RealmConfiguration realmConfig;
private String[] listOfStationNames;
ArrayAdapter adapter;
AutoCompleteTextView autoCompleteTextView1;

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

    //toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //fab
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    listOfStationNames = new String[] {"vvv", "rrr"};
    autoCompleteTextView1= (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);

    // field variable
    RealmResults<Station> stations;
    // field variable
    RealmChangeListener<RealmResults<Station>> changeListener = new RealmChangeListener<RealmResults<Station>>() {
        @Override
        public void onChange(RealmResults<Station> results) {
            // handle onSuccess()
        }
    };


    // Create the Realm configuration                   // In-Memory realm
    realmConfig = new RealmConfiguration.Builder(this).name("myrealm.realm").inMemory().build();
    // Open the Realm for the UI thread.
    realm = Realm.getInstance(realmConfig);

    // Call basicWrite
    basicWrite(realm);

    // Read
    stations = realm.where(Station.class).findAll();
    stations.addChangeListener(changeListener);

    adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,stations);
    autoCompleteTextView1.setAdapter(adapter);


}


private void basicWrite(Realm realm) {

    //(incase of using Callback) watch Slidenerd's approach 'AsyncTask transaction = realm.execute.....' and then closing transaction
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Station station = new Station();
            for(String stationName : listOfStationNames) {
                station.setName(stationName);
                realm.insert(station);
            }
        }
    });}



@Override
protected void onDestroy() {
    super.onDestroy();
    realm.close(); // Remember to close Realm when done.
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

Станция.java:

package com.vyshnav.realmexample;

import io.realm.RealmObject;

public class Station extends RealmObject {
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String toString(){//overriding the toString() method
    return name;
}
}

person V1 Kr    schedule 23.08.2016    source источник


Ответы (1)


Оцените фильтр в publishResults() вместо performFiltering(), потому что запросы Realm должны выполняться в потоке, в котором вы хотите получить доступ к результатам.

Вам нужно будет переопределить метод performFiltering для ArrayAdapter, как это сделал этот парень .

(Кроме того, теперь, когда я думаю об этом, возможно, вам стоит изменить свой ArrayAdapter на RealmBaseAdapter ~ источник или, по крайней мере, обрабатывать автоматические обновления с помощью RealmChangeListener вручную.)

person EpicPandaForce    schedule 23.08.2016
comment
k..дайте мне чек - person V1 Kr; 23.08.2016
comment
github.com/realm/realm-java/issues/2887 Как насчет этого один? Я думаю, это твое - person V1 Kr; 23.08.2016
comment
Это тоже хорошо работает, но использует RecyclerView, так что это своего рода решение для самостоятельной работы вместо счетчика/автозаполнения текста (и да, я написал это некоторое время назад с головы: P) - person EpicPandaForce; 23.08.2016
comment
Я пробовал это. Удалены некоторые ошибки (в основном орфографические ошибки и точки с запятой) и запущено. Приложение работает нормально, но элементы не отображаются. Я мог только ввести EditText. Но не отображается Reyclerview - person V1 Kr; 24.08.2016
comment
Также я включил макет строки в recyclerview, который вы пропустили, думая, была ли это проблема ... но все равно то же самое. - person V1 Kr; 24.08.2016
comment
Я немного обновил код, жаль, что пользователь так и не ответил, сказав, пожалуйста, ваш код не обрабатывается, если вводимый текст короче 2 и должен иметь состояние по умолчанию. - person EpicPandaForce; 24.08.2016
comment
Попробуйте увеличить слова, первоначальная версия должна работать для длины слова › 3, но сейчас я отредактировал ее, чтобы сделать ее лучше. - person EpicPandaForce; 24.08.2016
comment
Новая версия в основном показывает текстовое представление при поиске ... не повторное представление ... например: если у меня есть 4 слова appleA, appleaAB, appleABC и appleABCD, ничего не набирая, а также при вводе «a» или «appleA», он показывает полный список . При вводе «appleAB» отображается только appleAB, а при вводе «appleABC» отображается только appleABC. Почему это так? - person V1 Kr; 24.08.2016
comment
Я должен был бы увидеть код в этот момент. Учитывая, что это совершенно другая установка, в которой не используется Filterable, это должен быть отдельный вопрос. - person EpicPandaForce; 24.08.2016
comment
Все в порядке .. Я оцениваю ваши ответы. Теперь дайте мне погрузиться глубоко в Царство .. Tnx lot - person V1 Kr; 24.08.2016
comment
эй, это правильный способ: gist.github.com/sdex/83b75ce9c2f2e2654bec Хотя во время компиляции ошибок не показывалось, приложение вылетает при поиске - person V1 Kr; 26.08.2016
comment
Ну, он открывает новый экземпляр Realm каждый раз, когда что-то фильтрует, так что это довольно плохо, и вам нужно изменить false на Case.INSENSITIVE. - person EpicPandaForce; 26.08.2016
comment
О, я тоже думаю, что это ошибка. Новый экземпляр области не закрыт в дате. Я видел новый. rel="nofollow noreferrer">github.com/realm/realm-java/issues/646 здесь есть ответ, я думаю. Но я не мог создать экземпляр абстрактного класса в моей mainActivity, так как они оба уже расширяют другой. Вы знаете, как это сделать? - person V1 Kr; 27.08.2016
comment
Я разместил его как новый вопрос: stackoverflow.com/ вопросы/39179576/ - person V1 Kr; 27.08.2016