EasyAndroid icon indicating copy to clipboard operation
EasyAndroid copied to clipboard

EaseExecutor存在内存泄漏

Open jinanzhuan opened this issue 3 years ago • 0 comments

内存泄漏信息: ┬─── │ GC Root: Thread object │ ├─ java.lang.Thread instance │ Leaking: UNKNOWN │ Retaining 1.5 MB in 5990 objects │ Thread name: 'EasyExecutor' │ ↓ Thread.uncaughtExceptionHandler │ ~~~~~~~~~~~~~~~~~~~~~~~~ ├─ com.haoge.easyandroid.easy.EasyExecutor$TaskWrapper$run$1 instance │ Leaking: UNKNOWN │ Retaining 1.5 MB in 5975 objects │ Anonymous class implementing java.lang.Thread$UncaughtExceptionHandler │ ↓ EasyExecutor$TaskWrapper$run$1.this$0 │ ~~~~~~ ├─ com.haoge.easyandroid.easy.EasyExecutor$TaskWrapper instance │ Leaking: UNKNOWN │ Retaining 1.5 MB in 5974 objects │ ↓ EasyExecutor$TaskWrapper.result │ ~~~~~~ ├─ io.agora.chatdemo.av.DemoCallKitListener$2 instance │ Leaking: UNKNOWN │ Retaining 1.5 MB in 5970 objects │ Anonymous class implementing kotlin.jvm.functions.Function1 │ ↓ DemoCallKitListener$2.val$callback │ ~~~~~~~~~~~~ ├─ io.agora.chat.callkit.ui.EaseCallSingleBaseActivity$3 instance │ Leaking: UNKNOWN │ Retaining 1.5 MB in 5969 objects │ Anonymous class implementing io.agora.chat.callkit.listener.EaseCallKitTokenCallback │ this$0 instance of io.agora.chatdemo.av.CallSingleBaseActivity with mDestroyed = true │ ↓ EaseCallSingleBaseActivity$3.this$0 │ ~~~~~~ ╰→ io.agora.chatdemo.av.CallSingleBaseActivity instance ​ Leaking: YES (ObjectWatcher was watching this because io.agora.chatdemo.av.CallSingleBaseActivity received ​ Activity#onDestroy() callback and Activity#mDestroyed is true) ​ Retaining 1.5 MB in 5968 objects ​ key = 3c87f3d8-f77b-470e-ac32-9f733bb87aff ​ watchDurationMillis = 10939 ​ retainedDurationMillis = 5938 ​ mApplication instance of io.agora.chatdemo.DemoApplication ​ mBase instance of androidx.appcompat.view.ContextThemeWrapper

代码中使用如下: public class DemoCallKitListener implements EaseCallKitListener {

... private final EasyExecutor executor; ...

public DemoCallKitListener(Context context, UsersManager usersManager) {
    this.mContext = context;
    this.mUsersManager = usersManager;
    executor = EasyExecutor.newBuilder(0)
            .build();
}

@Override
public void onGenerateRTCToken(String userAccount, String channelName, EaseCallKitTokenCallback callback) {
    
    StringBuilder url = buildUrl(userAccount, channelName);

    getRtcToken(url.toString(), agoraUid, callback);
}


private void getRtcToken(String tokenUrl, int agoraUid, EaseCallKitTokenCallback callback) {
    executor.asyncResult(new Function1<Pair<Integer, String>, Unit>() {
        @Override
        public Unit invoke(Pair<Integer, String> response) {
           ...
                                JSONObject object = new JSONObject(responseInfo);
                                String token = object.getString("accessToken");
                                //Set your avatar nickname
                                setEaseCallKitUserInfo(ChatClient.getInstance().getCurrentUser());
                                callback.onSetToken(token, agoraUid);
            ...
            return null;
        }
    })
            .asyncTask(notifier -> {
                try {
                    Pair<Integer, String> response = EMHttpClient.getInstance().sendRequestWithToken(tokenUrl, null, EMHttpClient.GET);
                    return response;
                } catch (ChatException exception) {
                    exception.printStackTrace();
                }
                return null;
            });
}

jinanzhuan avatar Dec 19 '22 02:12 jinanzhuan