Android开发问题汇总

1. 调试和解决Bug的经验

1)遇到错误问题时候、如果是小众开源库 可以直接到issue中找到对应的问题。
2)如果没有,在StackOverflow上可以轻松找到。优先Google、少用Baidu。
3)普通的空指针异常定位到对象即可解决。
4)尽可能地让一个类、一个方法块只干一件事情,耦合太严重,可以拆分接口、类。否则会导致莫名奇妙的问题,并且难以看懂,降低效率和提升维护难度。
5)断点调试时候追踪代码问题是基本要求。
性能问题需要结合profiler 查看内存、CPU占用情况,并且结合 火焰图 FlameChart来查看可能的问题代码块。

2. 嵌套的RecyclerView滑动无响应的情况。

当滑动父RecyclerView的时候子RecyclerView可能没有响应,或者滑动卡顿。解决方案,刚开始考虑的是事件冲突的解决方案,外部RecyclerView全部拦截操作,或者内部拦截的方式设定dispatchTouchEvent。
由于它们是同方向的展示和滑动,而子RecyclerView需要展示的内容并不是非常多,因而自定义了一个新的LinearLayoutManager,禁止它的垂直滑动操作。因而不用重写两个RecyclerView并且效果良好。

public class CustomLinearLayoutManager extends LinearLayoutManager {
    public CustomLinearLayoutManager(Context context) {
        super(context);
    }

    @Override
    public boolean canScrollVertically() {
        return false;
    }
}
3. 莫名的网络加载不成功问题

Failed to connect to api.ioneball.com/139.224.7.244:443
https、http请求问题。当改为http时成功访问

4. 垂直滑动的ViewPager一点小问题

重写Viewpager时候,把横向滑动的逻辑部分复用改成了能够纵向垂直的逻辑。
动态刷新数据时不能够成功让pageradapter数据增加,并且在滑动到pageradapter中 size临界大小的时候,报空指针异常。
查看自己变更的源码发现,问题出在没有DataSetObserver,它为null,那么viewpager和pagerAdapter更新数据的桥梁也就断了。
产生问题的原因是由于,新定义的viewpager和pagerAdapter不在一个包中,而关键的绑定二者的方法 setViewPagerObserver也就不能直接调用了,所以DataSetObserver为null。当时采用的是反射的方式调用关联observer。

           if (mObserver == null) {
                mObserver = new PagerObserver();
            }
            try {
                Class<? extends PagerAdapter> aClass = mAdapter.getClass();
                Method method = aClass.getMethod("setViewPagerObserver");
                method.invoke(mAdapter, mObserver);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

断点调试发现总是走到了 NoSuchMethodException的部分。
所以重新查看了官方文档的API,发现了 registerDataSetObserver 方法。
将 Method method = aClass.getMethod("setViewPagerObserver"); 改为下面这句
Method method = aClass.getMethod("registerDataSetObserver", DataSetObserver.class);
即可成功调用了。

    /**
     * Register an observer to receive callbacks related to the adapter's data changing.
     *
     * @param observer The {@link android.database.DataSetObserver} which will receive callbacks.
     */
    public void registerDataSetObserver(DataSetObserver observer) {
        mObservable.registerObserver(observer);
    }

    /**
     * Unregister an observer from callbacks related to the adapter's data changing.
     *
     * @param observer The {@link android.database.DataSetObserver} which will be unregistered.
     */
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mObservable.unregisterObserver(observer);
    }

    void setViewPagerObserver(DataSetObserver observer) {
        synchronized (this) {
            mViewPagerObserver = observer;
        }
    }

源码中三者是写在一起的。

5. EventBus 无法更新UI?

断点发现能够成功传递数据。而界面UI却并不能够及时更新。
原因就是重新回到界面时,控件尚未被绑定就传递进了数据。数据就先于控件了。

6. Realm数据库报错情况

Each element of 'value' must be a valid managed object.
解决方式:

public class Product extends RealmObject {
     private RealmList<RecipientData> mRecipients;

     public void setRecipients(RealmList<RecipientData> mRecipientDatas) {
        this.mRecipients = mRecipientDatas;
     }

    public void addRecipient(RecipientData recipientData){
        if(mRecipients != null){
            mRecipients.add(recipientData);
        }
    }

    public void clearRecipients() {
        mRecipients = new RealmList<>();
    }
}

而不要在代码当中 new RealmList<>() 如下:

try(Realm realm = Realm.getDefaultInstance()) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmProductModel managedProductModel = realm.copyToRealm(originalProductModel);
            // managedProductModel.clearRecipients(); // calls mRecipients = new RealmList<>();

            List<RecipientData> unmanagedRecipientDatas = realm.copyFromRealm(productModel.getRecipients());
            for(RecipientData recipientData : unmanagedRecipientDatas) {
                recipientData.setFloatingRecipient(true);
                recipientData.setId(getNextKey(RecipientData.class));
            }
            // 不要这样操作
            RealmList<RecipientData> newRealmList = new RealmList<>(); 
            newRealmList.addAll(unmanagedRecipientDatas);
            managedProductModel.setRecipients(newRealmList);
        }
    });
}

应当这样:

try(Realm realm = Realm.getDefaultInstance()) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmProductModel managedProductModel = realm.copyToRealm(originalProductModel);
            managedProductModel.clearRecipients(); // calls mRecipients = new RealmList<>();

            List<RecipientData> unmanagedRecipientDatas = realm.copyFromRealm(originalProductModel.getRecipients());
            for(RecipientData recipientData : unmanagedRecipientDatas) {
                recipientData.setFloatingRecipient(true);
                recipientData.setId(getNewKey(RecipientData.class));
                managedProductModel.addRecipient(recipientData);
            }
        }
    });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容