1. 程式人生 > >android檢測卡頓問題,recycleview卡頓

android檢測卡頓問題,recycleview卡頓

recycleview雙列表聯動卡頓問題一直沒解決,今天找了個檢測卡頓原因的神器,附上地址
https://github.com/markzhai/AndroidPerformanceMonitor
整合步驟先簡單,
1.加依賴

 compile 'com.github.markzhai:blockcanary-android:1.5.0'

2.新建一個類

package com.huarenbang.zndc.utils;

import android.content.Context;

import com.github.moduth.blockcanary.BlockCanaryContext;
import
com.github.moduth.blockcanary.internal.BlockInfo; import java.io.File; import java.util.LinkedList; import java.util.List; /** * author : lwp * date :2018/8/30 * Email:[email protected] * 檢測卡頓 */ public class AppBlockCanaryContext extends BlockCanaryContext { /** * Implement in your project. * * @return
Qualifier which can specify this installation, like version + flavor. */
public String provideQualifier() { return "unknown"; } /** * Implement in your project. * * @return user id */ public String provideUid() { return "uid"; } /** * Network type * * @return
{@link String} like 2G, 3G, 4G, wifi, etc. */
public String provideNetworkType() { return "unknown"; } /** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */ public int provideMonitorDuration() { return -1; } /** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */ public int provideBlockThreshold() { return 1000; } /** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */ public int provideDumpInterval() { return provideBlockThreshold(); } /** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */ public String providePath() { return "/blockcanary/"; } /** * If need notification to notice block. * * @return true if need, else if not need. */ public boolean displayNotification() { return true; } /** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */ public boolean zip(File[] src, File dest) { return false; } /** * Implement in your project, bundled log files. * * @param zippedFile zipped file */ public void upload(File zippedFile) { throw new UnsupportedOperationException(); } /** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */ public List<String> concernPackages() { return null; } /** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */ public boolean filterNonConcernStack() { return false; } /** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */ public List<String> provideWhiteList() { LinkedList<String> whiteList = new LinkedList<>(); whiteList.add("org.chromium"); return whiteList; } /** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */ public boolean deleteFilesInWhiteList() { return true; } /** * Block interceptor, developer may provide their own actions. */ public void onBlock(Context context, BlockInfo blockInfo) { } }

3.在application的oncreate方法里加上:

  BlockCanary.install(this, new AppBlockCanaryContext()).start();

然後執行就行,有點像leak這個.
最後我發現原因是載入圖片Glide的問題,我看下提示的程式碼行,

 Glide.with(MyApplication.getContext()).load(mlist.get(position).getImg()).into(holder.ig_image);

adapter裡這個context我直接給的是application的,貌似已經知道了,改成從adapter的構造器傳進來的context試試
ok,完美,已經解決.上圖:
這裡寫圖片描述