当我想在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中的循环问题?
答案 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
}
// ...
}