android– 没有附加适配器;单击后退按钮并再次启动应用程序时跳过布局

android– 没有附加适配器;单击后退按钮并再次启动应用程序时跳过布局,第1张

概述AndroidStudio3.2Canary18kotlin_version=1.2.50我有一个使用recyclerview和适配器的简单应用程序.应用程序启动时会加载所有数据.但是,当我单击后退按钮并再次启动应用程序时.它不会显示数据(空白).如果我从内存中清除应用程序并启动应用程序.数据将正常加载.我从sqli @H_301_0@
AndroID Studio 3.2 Canary 18kotlin_version = 1.2.50
@H_301_0@我有一个使用recyclervIEw和适配器的简单应用程序.应用程序启动时会加载所有数据.
但是,当我单击后退按钮并再次启动应用程序时.它不会显示数据(空白).
如果我从内存中清除应用程序并启动应用程序.数据将正常加载.

@H_301_0@我从sqlite加载数据,每次都加载数据.因为它填充了insectDataModelList.

@H_301_0@进入RecyclerVIEw.java源代码后,原因是mAdapter为null.但是,我有
我将它设置为recyclervIEw时检查适配器是否正确.

@H_301_0@

voID dispatchLayout() {        if (mAdapter == null) {            Log.e(TAG, "No adapter attached; skipPing layout");            // leave the state in START            return;        }        ...}
@H_301_0@我的MainActivity.java是Java

@H_301_0@

public class MainActivity extends AppCompatActivity {    private RecyclerVIEw rvInsects;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findVIEwByID(R.ID.toolbar);        setSupportActionbar(toolbar);        rvInsects = (RecyclerVIEw)findVIEwByID(R.ID.recycler_vIEw);        DatabaseManager databaseManager = DatabaseManager.getInstance(this);        databaseManager.queryAllinsects("frIEndlyname");    }    private voID setupAdapter(List<InsectDataModel> insectDataModelList) {        final LayoutManager layoutManager = new linearlayoutmanager(                this, linearlayoutmanager.VERTICAL, false);        rvInsects.setLayoutManager(layoutManager);        rvInsects.setHasFixedSize(true);        final InsectAdapter insectAdapter = new InsectAdapter(insectDataModelList);        rvInsects.setAdapter(insectAdapter);        insectAdapter.notifyDataSetChanged();    }    /* Callback from database */    public voID loadAllinsects(final Cursor cursor) {        InsectInteractorMapper insectInteractorMapper = new InsectInteractorMapperImp();        final List<InsectDataModel> insectDataModelList = insectInteractorMapper.map(cursor);        /* data loaded with 24 items */        setupAdapter(insectDataModelList);    }}
@H_301_0@InsectAdapter.kt是Kotlin.

@H_301_0@

class InsectAdapter(private val insectList: MutableList<InsectDataModel>)    : RecyclerVIEw.Adapter<InsectAdapter.CustomInsectHolder>() {    overrIDe fun onCreateVIEwHolder(parent: VIEwGroup, vIEwType: Int): CustomInsectHolder {        val vIEw = LayoutInflater.from(parent.context)                .inflate(R.layout.insect_row_item, parent, false)        return CustomInsectHolder(vIEw)    }    overrIDe fun onBindVIEwHolder(holder: CustomInsectHolder, position: Int) {        holder.tvFrIEndlyname.text = insectList[position].frIEndlyname        holder.tvScIEntificname.text = insectList[position].scIEntificname    }    overrIDe fun getItemCount(): Int {        return insectList.size    }    class CustomInsectHolder(itemVIEw: VIEw) : RecyclerVIEw.VIEwHolder(itemVIEw) {        val ivDangerLevel: DangerLevelVIEw = itemVIEw.findVIEwByID(R.ID.ivDangerLevel)        val tvFrIEndlyname: TextVIEw = itemVIEw.findVIEwByID(R.ID.tvFrIEndlyname)        val tvScIEntificname: TextVIEw = itemVIEw.findVIEwByID(R.ID.tvScIEntificname)    }}
@H_301_0@数据库我使用rxjava2来进行查询

@H_301_0@

public class DatabaseManager {    private static DatabaseManager sInstance;    private MainActivity mainActivity;    private BUGsDbHelper mBUGsDbHelper;    public static synchronized DatabaseManager getInstance(MainActivity context) {        if (sInstance == null) {            sInstance = new DatabaseManager(context);        }        return sInstance;    }    private DatabaseManager(MainActivity context) {        mBUGsDbHelper = new BUGsDbHelper(context);        mainActivity = context;    }    @Suppresslint("CheckResult")    public voID queryAllinsects(String sortOrder) {        final InsectStorageInteractorImp insectStorageInteractorImp                = new InsectStorageInteractorImp(new InsectStorageImp(mBUGsDbHelper.getReadableDatabase()));        insectStorageInteractorImp.getAllSortedInsects(sortOrder)                .subscribeOn(Schedulers.io())                .observeOn(AndroIDSchedulers.mainThread())                .subscribe(new SingleObserver<Cursor>() {                    disposable disposable;                    @OverrIDe                    public voID onSubscribe(disposable d) {                        disposable = d;                    }                    @OverrIDe                    public voID onSuccess(Cursor cursor) {                        mainActivity.loadAllinsects(cursor);                        disposable.dispose();                    }                    @OverrIDe                    public voID one rror(Throwable e) {                        disposable.dispose();                    }                });    }}
@H_301_0@当应用程序第一次安装时,一切都按预期工作.如果你把它清除掉了.
但是,只有当您单击后退按钮,然后尝试启动应用程序时,它才会加载任何数据
因为在RecyclerVIEw类中mAdapter为null.

@H_301_0@当我单击后退按钮然后再次启动应用程序时.我得到的只是一个空白屏幕,即

@H_301_0@

@H_301_0@更新了DatabaseManager类,该类删除了单例并使用了弱引用来确保MainActivity实例被垃圾回收.

@H_301_0@

public class DatabaseManager {    private WeakReference<MainActivity> mainActivity;    private BUGsDbHelper mBUGsDbHelper;    public DatabaseManager(MainActivity context) {        mBUGsDbHelper = new BUGsDbHelper(context);        mainActivity = new WeakReference<>(context);    }    @Suppresslint("CheckResult")    public voID queryAllinsects(String sortOrder) {        final InsectStorageInteractorImp insectStorageInteractorImp                = new InsectStorageInteractorImp(new InsectStorageImp(mBUGsDbHelper.getReadableDatabase()));        insectStorageInteractorImp.getAllSortedInsects(sortOrder)                .subscribeOn(Schedulers.io())                .observeOn(AndroIDSchedulers.mainThread())                .subscribe(new SingleObserver<Cursor>() {                    disposable disposable;                    @OverrIDe                    public voID onSubscribe(disposable d) {                        disposable = d;                    }                    @OverrIDe                    public voID onSuccess(Cursor cursor) {                        mainActivity.loadAllinsects(cursor);                        disposable.dispose();                    }                    @OverrIDe                    public voID one rror(Throwable e) {                        disposable.dispose();                    }                });    }}
@H_301_0@非常感谢任何建议,

解决方法:

@H_301_0@单击后退按钮并重新启动应用程序时,将启动一个新的MainActivity实例.

@H_301_0@同时,您的DatabaseManager是一个单例.它的引用存储为静态变量.它在活动娱乐中幸存下来.它将一直存在直到该过程被杀死.

@H_301_0@因此,当您第二次运行queryAllinsects时,回调将被发送到MainActivity的旧实例,该实例不再可见.

@H_301_0@您不应该在DatabaseManager中保留对MainActivity的引用.这是一个内存泄漏,因为它不能被垃圾收集.

总结

以上是内存溢出为你收集整理的android – 没有附加适配器;单击后退按钮并再次启动应用程序时跳过布局全部内容,希望文章能够帮你解决android – 没有附加适配器;单击后退按钮并再次启动应用程序时跳过布局所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104711.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存