奇怪的行为 - App突然产生ANR

时间:2018-01-12 10:21:19

标签: android git performance realm android-anr-dialog

我知道这听起来很奇怪/荒谬,但我遇到了这个问题

更新#2

我正在分享@EpicPandaForce指示的代码。

SyncService.onNetworkSuccess

public void onNetworkCallSuccess(Response response) {
    List<TransactionHistory> historyList = (List<TransactionHistory>) response.body();
    if(historyList != null && historyList.size() > 0) {
        TransactionHistory max = Collections.max(historyList, new Comparator<TransactionHistory>() {
            @Override
            public int compare(TransactionHistory o1, TransactionHistory o2) {
                return o1.getUpdatedAt().compareTo(o2.getUpdatedAt());
            }
        });

        if(max != null) {
            session.putStringForKey(Session.timeStamp, String.valueOf(max.getUpdatedAt()));
        }
        for(TransactionHistory history : historyList) {
            String id;
            if(history.getTo().equals(history.getFrom()) ||
                    history.getFrom().equals(session.getStringForKey(Session.fpIdKey)))
                id = history.getTo();
            else id = history.getFrom();


            LatestTransactionResponse latestTransactionResponse = new LatestTransactionResponse();
            DateTransactionResponse dateTransactionResponse = new DateTransactionResponse(DateUtility.getDateFromEpoch(history.getEpoch()));

            dateTransactionResponse.addTransaction(history);
            latestTransactionResponse.setArchived(history.isArchived());
            latestTransactionResponse.addTransaction(history);
            latestTransactionResponse.setId(id);
            dateTransactionResponse.setId(id);
            LatestTransactionRepository.getInstance().addLatestTransaction(realm,
                    latestTransactionResponse);
            ContactTransactionRepository.getInstance().addNewTransaction(realm, dateTransactionResponse, id);
        }

        try {
            Activity temp = MyFirebaseMessagingService.getRunningActivity();
            if(temp != null) {
                if(temp instanceof MainActivity) {
                    ((MainActivity) temp).refreshLatestTransactions();

                } else if(temp instanceof TransactionDetailActivity) {
                    ((TransactionDetailActivity) temp).refreshOnMainThread();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

addNewTransaction

public void addNewTransaction(Realm realm, final DateTransactionResponse response, final String id) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            List<TransactionHistory> tempHistoryList;
            DateTransactionResponse temp = realm
                    .where(DateTransactionResponse.class)
                    .equalTo("id", id)
                    .equalTo("date", response.getDate())
                    .findFirst();

            if(temp == null)
                realm.insertOrUpdate(response);
            else {
                tempHistoryList = temp.getTransactions();

                for(TransactionHistory history : response.getTransactions()) {
                    boolean found = false;
                    for(int i=0; i < tempHistoryList.size(); i++) {
                        if (history.getId().equals(tempHistoryList.get(i).getId())) {
                            if(history.getStatus().equals(tempHistoryList.get(i).getStatus())) {
                                found = true;
                                break;
                            } else {
                                tempHistoryList.get(i).setStatus(history.getStatus());
                            }
                        }
                    }
                    if(!found)
                        tempHistoryList.add(history);
                }

                //realm.insertOrUpdate(temp);
                realm.copyToRealm(temp);

                //DateTransactionResponse transactionResponse = temp;
                //temp.deleteFromRealm();
                //realm.insertOrUpdate(temp);
            }
        }
    });
    //removeDuplicateTransactions(realm);
}

removeDuplicateTransaction

private void removeDuplicateTransactions(Realm realm) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmQuery<DateTransactionResponse> query = realm.where(DateTransactionResponse.class);
            RealmResults<DateTransactionResponse> results = query.findAll();
            List<DateTransactionResponse> transactions = new ArrayList<>(results);
            for(DateTransactionResponse response : transactions) {
                List<TransactionHistory> historyList = response.getTransactions();
                Set<TransactionHistory> historySet = new LinkedHashSet<>(historyList);

                RealmList<TransactionHistory> histories = new RealmList<>();
                histories.addAll(new ArrayList<>(historySet));

                response.setTransactions(histories);

                realm.copyToRealm(response);
            }

        }
    });

}

更新#1

主屏幕上有3个RecyclerView标签。以下是所有三个Adapter的实施。

我一直在开发应用程序。它一直工作得很好,我偶尔会努力提高它的性能。它仍在开发中。几天前,我删除了分支并且没有做任何值得注意的事情(只有一两个错误修复)并开始测试它和OOPS它开始提供ANR。我回到上一个分支,很奇怪它开始给我相同的结果。我已删除所有更改并尝试,仍然是相同的结果。我不确定发生了什么。我尝试学习traces.txt,但无法按this SO回答中的建议找到waiting to lock

我也很难阅读traces,无法找到罪魁祸首。 Heretraces.txt文件。

我在我的应用程序中使用Realm作为数据库,并且找不到在其他线程上对Realm执行操作的方法。我试图在代码中找到任何其他罪魁祸首,但所有这些都与以前一样完全正常。

层次

这是App Hierarchy。

显示登录屏幕,用户输入PIN。然后是主屏幕。主屏幕包含4个选项卡,就像WhatsApp一样,第一个选项卡是相机,其余包含RecyclerView,其中数据从Realm填充。 ANR只发生在这里。请记住,它几天前完全是完美的,直到我拿出分支并修复了一些与主屏幕无关的错误。

非常感谢任何帮助或指导。

0 个答案:

没有答案