1:完成天空之境的页面,可以打开规则页面,
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user