智汀云盘-开发指南android(文件/文件夹上传下载:gomobile)

观书散遗帙,探古穷至妙。这篇文章主要讲述智汀云盘-开发指南android:文件/文件夹上传下载:gomobile相关的知识,希望能为你提供帮助。


  1.为什么要使用gomobile作为上传下载插件?


  1. 高性能-协程
    golang可以实现跨平台编译,开发出的插件android/OS平台都可以使用,研发人员能少写代码,运维方便维护部署。golang 源码级别支持协程,实现简单。协程使用,当底层遇到阻塞会自动切换,也就是逻辑层通过同步方式实现异步,充分利用了系统资源,同时避免了异步状态机的反人类异步回调,实现方式更为直观简单。golang 协程是通过多线程维护,所以避免不了锁的使用,但也极大解决了研发效率问题。
  2. 生态
    有谷歌做背书,生态丰富,可以轻松获得各种高质量轮子。这样用户可以专注于业务逻辑,避免重复造轮子。
  3. 部署
    部署简单,源码编译成执行文件后,可以直接运行,减少了对其它插件依赖。不像其它语言,执行文件依赖各种插件,各种库,研发机器运行正常,放到生产环境上,死活跑不起来,需要各种安装和版本匹配。自己的  GC,有  defer  功能,函数可以返回多个参数等等。

2.gomobile前期工作

  1. 需要把gomobile使用到的数据库mobile.db 复制到Android项目下assets文件夹目录下。
  2. 把gomobile插件gonet.aar复制到app-> libs目录下。
  3. 在build.gradle(:app)目录下添加依赖 :implementation (name:gonet,ext:aar)。
  4. 在android添加如下代码:
android
.......
repositories
flatDir
dirs libs


......


5. 需要在使用gomobile插件前把在assets文件下的数据库mobile.db复制到手机sd卡
private void copyAssetFileToSD()
String fileName = GonetUtil.dbName;
String fileRoot = GonetUtil.dbPath;
String filePath = fileRoot + File.separator + fileName;
File file = new File(filePath);
if ((file.exists() & & file.length() == 0) || !file.exists())
LogUtil.e("fileRoot=path2=" + filePath);
BaseFileUtil.copyAssetData(fileName, fileRoot);





/**
* 拷贝assets目录下的文件
*
* @param assetsFileName assets目录下的文件名
* @param targetPath目标文件夹路径
*/
public static void copyAssetData(String assetsFileName, String targetPath)
new Thread(() ->
try
AssetManager am = UiUtil.getContext().getAssets();
//得到数据库输入流,就是去读数据库
InputStream is = am.open(assetsFileName);

//用输出流写到SDcard上
FileOutputStream fos = new FileOutputStream(new File(targetPath, assetsFileName));
//创建byte数据,1KB写一次
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) > 0)
fos.write(buffer, 0, count);

//关闭
fos.flush();
close(fos);
close(is);
catch (IOException e)
e.printStackTrace();

).start();


3.  gomobile上传文件1.  初始化上传管理管理器


/**
* 初始化上传管理类
*/
public static void initUploadManager()
if (mUploadManager == null & & !TextUtils.isEmpty(Constant.scope_token))
UiUtil.starThread(() ->
String headerStr = "\\"scope-token\\":\\"" + Constant.scope_token + "\\"";
mUploadManager = Gonet.newUploadManager(httpUrl, dbPath, headerStr);
mUploadManager.run(headerStr);
);



newUploadManager请求参数解析:
httpUrl:上传服务器地址
dbPath:数据库地址
headerStr:请求头文件


2. 上传文件创建对象


public synchronized static void uploadFile(String filePath, String folderPath, String pwd, UpOrDownloadListener upOrDownloadListener)
if (mUploadManager != null)
UiUtil.starThread(() ->
String fileName = getFileName(filePath);
String url = HttpConfig.uploadFileUrl + folderPath + "/" + fileName;
String headerStr = "\\"scope-token\\":\\"" + Constant.scope_token + "\\"";
mUploadManager.createFileUploader(url, filePath, fileName, headerStr, pwd);
);



createFileUploader请求参数解析:
url:上传服务器地址
filePath:本地文件路径
fileName:文件名称(包括文件后缀)
headerStr:请求头文件
pwd:上传文件需要的密码


3.  开始上传文件
public static void startUpload(long id)
if (mUploadManager != null)
mUploadManager.start(id);



参数解析
id:任务id


4.    暂停上传文件
public static void stopUpload(long id)
if (mUploadManager != null)
mUploadManager.stop(id);



参数解析
id:任务id


5.获取上传文件列表
public static void getUploadList(OnGetFilesListener listener)
UiUtil.starThread(() ->
String jsonData = https://www.songbingjia.com/android/Gonet.getUploadList(dbPath);
Log.e("getUploadList=返回列表json字符串="+jsonData);
);


3.gomobile下载文件1 初始化下载文件管理器
public static void initDownloadManager()
LogUtil.e(TAG + "初始化");
if (mDownloadManager == null & & !TextUtils.isEmpty(Constant.scope_token))
UiUtil.starThread(() ->
String headerStr = "\\"scope-token\\":\\"" + Constant.scope_token + "\\"";
mDownloadManager = Gonet.newDownloadManager(apiUrl, dbPath, headerStr);
mDownloadManager.run(headerStr);
)



newDownloadManager解析
apiUrl:应用服务器api基地址
dbPath:数据库文件夹地址
headerStr:请求头文件


2. 创建下载文件对象
public synchronized static void downloadFile(String filePath, String pwd, UpOrDownloadListener upOrDownloadListener)
if (mDownloadManager != null)
UiUtil.starThread(() ->
String url = HttpConfig.downLoadFileUrl + filePath;
String headerStr = "\\"scope-token\\":\\"" + Constant.scope_token + "\\"";
mDownloadManager.createFileDownloader(url, headerStr, pwd);
);



createFileDownloader解析
url:"/plugin/wangpan/resources"
headerStr:请求头文件
pwd:文件密码


3. 创建下载文件夹对象
public static void downloadFolder(String filePath, String pwd, UpOrDownloadListener startDownListener)
if (mDownloadManager != null)
UiUtil.starThread(() ->
String url1 = HttpConfig.downLoadFolderUrl1; //网络请求地址1
String url2 = HttpConfig.downLoadFolderUrl2; //网络请求地址2
String headerStr = "\\"scope-token\\":\\"" + Constant.scope_token + "\\"";
mDownloadManager.createDirDownloader(url1, url2, filePath, headerStr, pwd)
);



createDirDownloader解析
url1:"/plugin/wangpan/resources/*path"
url2:"/plugin/wangpan/download/*path"
filePath:下载文件夹路径
headerStr:请求头文件
pwd:文件夹密码


4. 开始下载任务 
public static void startDownload(long id)
if (mDownloadManager != null)
mDownloadManager.start(id);



5.停止下载任务
public static void stopDownload(long id)
if (mDownloadManager != null)
mDownloadManager.stop(id);



6. 删除下载任务
public static void deleteDownload(long id)
if (mDownloadManager != null)
mDownloadManager.delete(id);



4.  使用插件注意事项1 退出APP需要调用
public static void exitApp()
if (mUploadManager != null)
mUploadManager.quitAPP();

if (mDownloadManager != null)
mDownloadManager.quitAPP();



2 监听网络变化通知
public static void netWorkNotice()
if (mUploadManager != null)
mUploadManager.networkNil();

if (mDownloadManager != null)
mDownloadManager.networkNil();



3 上传域名的更变
public static void changeHost()
String baseUrl = getBaseUrl();
if (mUploadManager != null)
mUploadManager.changeHost(newHost);

if (mDownloadManager != null)
mDownloadManager.changeHost(newHost);





【智汀云盘-开发指南android(文件/文件夹上传下载:gomobile)】


    推荐阅读