gpt4 book ai didi

android - 房间 : Cannot access database on the main thread since it may potentially lock the UI for a long period of time

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:07:31 24 4
gpt4 key购买 nike

在主 Activity 中,我有包含成员和点击监听器的 LiveData。如果我点击一个成员,那么他的 ID 将通过 intent.putExtra 传递。该 ID 稍后会传递给在此 Activity 中打开的方法。通过此 Activity ,我想查看成员的详细信息。在我的 MemberInfo Activity 中,我标记了我的问题所在的一行。它向我显示此错误:无法在主线程上访问数据库,因为它可能会长时间锁定 UI。

我的 DAO 包含以下代码:

@Query("SELECT * FROM member_table WHERE MemberID=:id")
Member getMemberInfo(long id);

这是我的主要 Activity :

public class MemberMainActivity extends AppCompatActivity implements MemberListAdapter.MemberClickListener{

private MemberViewModel mMemberViewModel;
private List<Member> mMember;

void setMember(List<Member> members) {
mMember = members;
}

public static final int NEW_MEMBER_ACTIVITY_REQUEST_CODE = 1;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_member);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MemberMainActivity.this, NewMemberActivity.class);
startActivityForResult(intent, NEW_MEMBER_ACTIVITY_REQUEST_CODE);
}
});

RecyclerView recyclerView = findViewById(R.id.recyclerviewcard_member);
final MemberListAdapter adapter = new MemberListAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

mMemberViewModel = ViewModelProviders.of(this).get(MemberViewModel.class);

mMemberViewModel.getAllMember().observe(this, new Observer<List<Member>>() {
@Override
public void onChanged(@Nullable final List<Member> members) {
mMember = members;
// Update the cached copy of the words in the adapter.
adapter.setMember(members);
}
});

}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == NEW_MEMBER_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
Member member = new Member(data.getStringExtra(NewMemberActivity.EXTRA_REPLY), data.getStringExtra(NewMemberActivity.EXTRA_REPLY2));
mMemberViewModel.insert(member);
} else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}

public void onMemberClick(int position) {
Member member = mMember.get(position);
Intent intent = new Intent(getApplicationContext(),MemberInfo.class);
intent.putExtra("MemberID", member.getId());
MemberInfo.open(this, member.getId());

}

}

这是我的 Activity :

public class MemberInfo extends AppCompatActivity {

public static void open(Activity activity, long memberid) {
Intent intent = new Intent(activity, MemberInfo.class);
intent.putExtra("MemberID", memberid);
activity.startActivity(intent);
}

private List<Member> mMember;
private MemberViewModel mMemberViewModel;


void setMember(List<Member> members){
mMember = members;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memberinfo);

Log.i("okay", "memberinfo");
Intent intent = getIntent();
if (intent != null && intent.hasExtra("MemberID")) {
long memberid = intent.getLongExtra("MemberID", -1);
// TODO: get customer details based on customer id
TextView firstname = findViewById(R.id.layout_memberfirstname);
TextView surname = findViewById(R.id.layout_membersurname);
TextView balance = findViewById(R.id.layout_memberbalance);
-------------Member member = MemberRoomDatabase.getDatabase().memberDao().getMemberInfo(memberid);-------------
firstname.setText(member.getFirstname());
surname.setText(member.getSurname());

}
else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}
}

我认为这可能是因为我缺少 AsyncTask 方法。我试过了,但这也没有用:

private static class insertMemberInfoAsyncTask extends AsyncTask<Member, Void, Void> {

private MemberDao mAsyncTaskDao;

insertMemberInfoAsyncTask(MemberDao dao) {
mAsyncTaskDao = dao;
}

@Override
protected Void doInBackground(Member... params) {
Member member = params[0];
mAsyncTaskDao.getMemberInfo(member.getId());
return null;
}
}

public Member getMemberInfo(long id) {
mAllMember = mMemberDao.getAllMember();
Member member = mMemberDao.getMemberInfo(id);
new insertMemberInfoAsyncTask(mMemberDao).execute(member);
return member;
}

我想我用错了方法。谁能帮帮我?

最佳答案

一个选项是将您的查询更新为:

@Query("SELECT * FROM member_table WHERE MemberID=:id")
LiveData<Member> getMemberInfo(long id);

(或类似的,使用 Flowable)。这避免了手动创建您自己的 AsyncTask 的需要。

返回 LiveData Member 类型的包装器会自动向 Room 发出信号,表明查询可以/应该异步执行。每https://developer.android.com/training/data-storage/room/accessing-data (我的重点):

Note: Room doesn't support database access on the main thread unless you've called allowMainThreadQueries() on the builder because it might lock the UI for a long period of time. Asynchronous queries—queries that return instances of LiveData or Flowable—are exempt from this rule because they asynchronously run the query on a background thread when needed.

关于android - 房间 : Cannot access database on the main thread since it may potentially lock the UI for a long period of time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com