这个Realm实例已经关闭,使其无法使用?

时间:2017-12-24 12:06:38

标签: android realm realm-mobile-platform

当我想在UI显示屏上显示数据时,我的Android项目崩溃了。我从Stackoverflow尝试了很多解决方案。这些解决方案仍然不适合我。错误日志和Activity类如下所示。

由于Looper可能会出现问题。当循环运行时,我正面临这个问题。

Error log is below:
  

java.lang.IllegalStateException:此Realm实例已经存在   关闭,使其无法使用。                                                                                at io.realm.internal.OsResults $ Iterator。(OsResults.java:45)                                                                                在   io.realm.OrderedRealmCollectionImpl $ RealmCollectionIterator。(OrderedRealmCollectionImpl.java:558)                                                                                在   io.realm.OrderedRealmCollectionImpl.iterator(OrderedRealmCollectionImpl.java:239)                                                                                在io.realm.RealmResults.iterator(RealmResults.java:62)                                                                                在   com.dayspringltd.dlog.activity.ReportingActivity $ 1 $ 1 $ 1 $ 1.onClick(ReportingActivity.java:159)                                                                                在android.view.View.performClick(View.java:4652)                                                                                在android.view.View $ PerformClick.run(View.java:19311)                                                                                在android.os.Handler.handleCallback(Handler.java:733)                                                                                在android.os.Handler.dispatchMessage(Handler.java:95)                                                                                在android.os.Looper.loop(Looper.java:146)                                                                                在android.app.ActivityThread.main(ActivityThread.java:5692)                                                                                at java.lang.reflect.Method.invokeNative(Native Method)                                                                                在java.lang.reflect.Method.invoke(Method.java:515)                                                                                在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1291)                                                                                在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)                                                                                在dalvik.system.NativeStart.main(本地方法)

主要问题是ReportingActivity文件行号159:代码如下:

public class ReportingActivity extends AppCompatActivity {

    //Realm Operation
    private Realm realm;
    RealmResults<Visit> resultsInCount;
    RealmResults<Visit> resultsOutCount;
    RealmResults<Visitor> resultsVisitor;


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

        //initialize Realm database instance
        realm = Realm.getDefaultInstance();

        init();
        initClickListeners();
        try {
            realmTransaction();
        }finally {
            realm.close();
        }
    }

private void realmTransaction() {
        // Realm transaction
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {

                //All fields value of Visit table
                resultsInCount = realm.where(Visit.class).notEqualTo("visitInDateTime","0").findAll();
                resultsOutCount = realm.where(Visit.class).greaterThan("visitOutDateTime",0).findAll();
                //All the data from Visitor class
                resultsVisitor = realm.where(Visitor.class).findAll();
                Log.d("Visitor:",resultsVisitor+"");

                //Total IN count
                totalINCount = resultsInCount.size();
                Log.d("inCount:", totalINCount+"");
                //Total OUT count
                totalOUTCount = resultsOutCount.size();
                Log.d("outCount:", totalOUTCount+"");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        in_value.setText("" + totalINCount);
                        out_value.setText("" + totalOUTCount);


                        //All report operation will be performed here
                        generate_report.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {

                                // custom dialog
                                final Dialog dialog = new Dialog(ReportingActivity.this);
                                dialog.setContentView(R.layout.report_custom_dialog);
                                dialog.setTitle("Report");
                                //Window window = dialog.getWindow();
                                //window.setBackgroundDrawableResource(android.R.color.white);


                                Button all_report = dialog.findViewById(R.id.all_report);
                                all_report.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        ReportingLayout.setVisibility(View.GONE);
                                        ReportingViewLayout.setVisibility(View.VISIBLE);
                                        dialog.dismiss();


                                        TableLayout stk = findViewById(R.id.tableLayoutReport);
                                        TableRow tbrow0 = new TableRow(ReportingActivity.this);

                                        TextView tv0 = new TextView(ReportingActivity.this);
                                        tv0.setText(" Name ");
                                        tv0.setTextColor(Color.BLACK);
                                        tbrow0.addView(tv0);

                                        TextView tv1 = new TextView(ReportingActivity.this);
                                        tv1.setText(" Phone ");
                                        tv1.setTextColor(Color.BLACK);
                                        tbrow0.addView(tv1);

...................
.....................


                                        tbrow0.addView(tv3);

                                        stk.addView(tbrow0);

                                        `for(Visitor visitor : resultsVisitor)` {
                                            TableRow tbrow = new TableRow(ReportingActivity.this);

                                            TextView t1v = new TextView(ReportingActivity.this);
                                            t1v.setText("");
                                            t1v.append("" + visitor.getVisitorName());
                                            t1v.setTextColor(Color.BLACK);
                                            t1v.setGravity(Gravity.CENTER);
                                            tbrow.addView(t1v);

                                            ..............

                                            stk.addView(tbrow);
                                        }
                                    }
                                });

                                dialog.show();
                            }
                        });
                    }
                });

            }
        });
    }

Noe,我有另一个名为ConfirmaitonActivity.java的Activity,负责将数据插入Realm DB。当我想显示数据时,数据来自Realm DB,但是当我想将数据显示到UI显示后面的行创建问题

for(Visitor visitor : resultsVisitor) {

最初我试图在onDestroy()方法中关闭Realm数据库,但这也不起作用。

那么,可以做些什么来解决Realm DB中的循环问题?

1 个答案:

答案 0 :(得分:1)

最后我能够解决Looper线程问题,我实现了RealmChangeListener并且像魅力一样工作:)我引用了下面的链接,我得到了解决方案。 https://realm.io/docs/java/latest/#best-practices

来自Realm官方文档:

在UI线程和所有其他Looper线程上,当对Realm进行更改时,将自动刷新所有RealmObjects和RealmResults。这意味着在对RealmChangedListener作出反应时不必再次获取这些对象。对象已经更新,可以在屏幕上重新绘制。

public class MyActivity extends Activity {

    private Realm realm;
    private RealmResults<Person> allPersons;
    private RealmChangeListener realmListener = new RealmChangeListener() {
        @Override
        public void onChange(Realm realm) {
            // Just redraw the views. `allPersons` already contain the
            // latest data.
            invalidateView();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        realm = Realm.getDefaultInstance();
        realm.addRealmChangeListener(listener);
        allPerson = realm.where(Person.class).findAll(); // Create the "live" query result
        setupViews(); // Initial setup of views
        invalidateView(); // Redraw views with data
    }

    // ...
}