1:完成天空之境的页面,可以打开规则页面,

This commit is contained in:
2025-08-27 23:12:46 +08:00
parent 0b128f3d72
commit 6a7be63284
4 changed files with 226 additions and 97 deletions

View File

@@ -1,12 +1,16 @@
package com.xscm.moduleutil.widget;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.net.Uri;
import android.opengl.GLES11Ext;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.View;
@@ -22,6 +26,7 @@ import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.ui.PlayerView;
import com.liulishuo.okdownload.DownloadTask;
import com.liulishuo.okdownload.StatusUtil;
import com.liulishuo.okdownload.core.cause.EndCause;
import com.liulishuo.okdownload.core.cause.ResumeFailedCause;
import com.liulishuo.okdownload.core.listener.DownloadListener1;
@@ -32,16 +37,18 @@ import com.opensource.svgaplayer.SVGADynamicEntity;
import com.opensource.svgaplayer.SVGAImageView;
import com.opensource.svgaplayer.SVGAParser;
import com.opensource.svgaplayer.SVGAVideoEntity;
import com.tencent.qgame.animplayer.AnimConfig;
import com.tencent.qgame.animplayer.inter.IAnimListener;
import com.tencent.qgame.animplayer.inter.IFetchResource;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.databinding.RoomViewSvgaAnimBinding;
import com.xscm.moduleutil.utils.Md5Utils;
import com.xscm.moduleutil.utils.MemoryOptimizationUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.logger.Logger;
import com.tencent.qgame.animplayer.AnimConfig;
import com.tencent.qgame.animplayer.inter.IAnimListener;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.LinkedHashMap;
@@ -51,7 +58,6 @@ import java.util.Queue;
public class AvatarFrameView extends FrameLayout implements IAnimListener {
@Override
public void onFailed(int i, @Nullable String s) {
@@ -103,33 +109,9 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
} else {
isPlaying = false;
// playNextFromQueue(); // 播放下一项
// 播放完成后立即清理当前资源
clearCurrentResource();
mainHandler.postDelayed(this::playNextFromQueue, 50);
}
}
private void clearCurrentResource() {
// 清理当前播放的文件引用
// mFile = null;
// 清理SVGA资源
if (svgaSurface != null) {
svgaSurface.stopAnimation();
svgaSurface.clearAnimation();
svgaSurface.setImageDrawable(null);
}
// 清理MP4资源
if (exoPlayer != null) {
exoPlayer.stop();
exoPlayer.clearVideoSurface();
}
if (mBinding != null && mBinding.playView != null) {
mBinding.playView.stopPlay();
}
}
@Override
public void onVideoDestroy() {
@@ -385,52 +367,118 @@ public class AvatarFrameView extends FrameLayout implements IAnimListener {
} else {
DownloadTask task = new DownloadTask.Builder(url, PathUtils.getInternalAppCachePath()
, Md5Utils.getStringMD5(url) + ".mp4")
.setMinIntervalMillisCallbackProcess(100)
.setPassIfAlreadyCompleted(false)
.setMinIntervalMillisCallbackProcess(1000)
.setPassIfAlreadyCompleted(true)
.setAutoCallbackToUIThread(true)
.build();
// if (StatusUtil.isCompleted(task)) {
// playMp4(task.getFile());
// mFile = task.getFile();
// } else {
task.enqueue(new DownloadListener1() {
@Override
public void taskStart(@NonNull DownloadTask task, @NonNull Listener1Assist.Listener1Model model) {
Logger.e("taskStart", model);
}
@Override
public void retry(@NonNull DownloadTask task, @NonNull ResumeFailedCause cause) {
Logger.e("retry", cause);
task.cancel();
// 添加以下优化配置
.setConnectionCount(1) // 对于大文件,减少连接数可能更稳定
.build();
if (StatusUtil.isCompleted(task)) {
playMp4(task.getFile());
mFile = task.getFile();
} else if (StatusUtil.isSameTaskPendingOrRunning(task)) {
// 如果任务正在进行中,等待完成
// 可以通过监听器处理
attachToExistingTask(task);
} else {
task.enqueue(new DownloadListener1() {
@Override
public void taskStart(@NonNull DownloadTask task, @NonNull Listener1Assist.Listener1Model model) {
Logger.e("AvatarFrameView1", model);
}
@Override
public void retry(@NonNull DownloadTask task, @NonNull ResumeFailedCause cause) {
Logger.e("AvatarFrameView2", cause);
task.cancel();
// CrashReport.postCatchedException(new RuntimeException("下载文件重试:" + cause == null ? "" : cause.name()));
}
@Override
public void connected(@NonNull DownloadTask task, int blockCount, long currentOffset, long totalLength) {
Logger.e("connected", blockCount);
}
@Override
public void progress(@NonNull DownloadTask task, long currentOffset, long totalLength) {
Logger.e("progress", currentOffset);
}
@Override
public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, @NonNull Listener1Assist.Listener1Model model) {
Logger.e("taskEnd", model);
playMp4(task.getFile());
mFile = task.getFile();
if (cause != null && cause != EndCause.COMPLETED) {
// CrashReport.postCatchedException(new RuntimeException("下载任务结束:" + cause == null ? "" : cause.name() + "_realCause:" + realCause == null ? "" : realCause.getMessage()));
}
}
});
// }
@Override
public void connected(@NonNull DownloadTask task, int blockCount, long currentOffset, long totalLength) {
Logger.e("AvatarFrameView3", blockCount);
}
@Override
public void progress(@NonNull DownloadTask task, long currentOffset, long totalLength) {
Logger.e("AvatarFrameView4", currentOffset);
}
@Override
public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, @NonNull Listener1Assist.Listener1Model model) {
Logger.e("AvatarFrameView5", model);
// playMp4(task.getFile());
// mFile = task.getFile();
// if (cause != null && cause != EndCause.COMPLETED) {
//// CrashReport.postCatchedException(new RuntimeException("下载任务结束:" + cause == null ? "" : cause.name() + "_realCause:" + realCause == null ? "" : realCause.getMessage()));
// }
if (cause == EndCause.COMPLETED) {
File downloadedFile = task.getFile();
if (downloadedFile != null && downloadedFile.exists() && downloadedFile.length() > 0) {
playMp4(downloadedFile);
mFile = downloadedFile;
} else {
Logger.e(TAG, "Downloaded file is invalid");
handleDownloadFailure(url, cause, new IOException("Downloaded file is invalid"));
}
} else {
handleDownloadFailure(url, cause, realCause);
}
}
});
}
}
}
private void handleDownloadFailure(String url, EndCause cause, Exception realCause) {
Logger.e(TAG, "Download failed: " + cause + ", real cause: " + realCause);
// 尝试重试一次
mainHandler.postDelayed(() -> {
// 检查队列是否仍然包含这个项目
boolean shouldRetry = false;
for (PlayItem item : playQueue) {
if (item.url.equals(url)) {
shouldRetry = true;
break;
}
}
if (shouldRetry) {
// 重新添加到队列开头
playQueue.add(new PlayItem(url, mType));
playNextFromQueue();
} else {
isPlaying = false;
playNextFromQueue();
}
}, 1000); // 1秒后重试
}
// 添加检查进行中任务的方法
private void attachToExistingTask(DownloadTask task) {
// 为已经在队列中的任务附加监听器
task.enqueue(new DownloadListener1() {
@Override
public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause, @NonNull Listener1Assist.Listener1Model model) {
if (cause == EndCause.COMPLETED) {
playMp4(task.getFile());
mFile = task.getFile();
} else {
isPlaying = false;
playNextFromQueue();
}
}
// 其他回调方法保持空实现或按需处理
@Override public void taskStart(@NonNull DownloadTask task, @NonNull Listener1Assist.Listener1Model model) {}
@Override public void retry(@NonNull DownloadTask task, @NonNull ResumeFailedCause cause) {}
@Override public void connected(@NonNull DownloadTask task, int blockCount, long currentOffset, long totalLength) {}
@Override public void progress(@NonNull DownloadTask task, long currentOffset, long totalLength) {}
});
}
private void playMp4(File file) {
if (file != null) {
mBinding.playView.startPlay(file);