我们公司有点击下载按钮,下载视频或者pdf文件,并能在下载列表中显示出来。网上查阅很多,发现OKgo刚好适合。

下面是框架的简单使用。(另外新增下载完成,可用手机自带软件观看pdf或视频)

界面如下:

代码实现:可参考GitHub网站OKgo的使用:

1.配置文件

 compile 'com.android.support:recyclerview-v7:26+'compile 'com.android.support:design:26+'compile 'com.github.bumptech.glide:glide:3.7.0'compile 'com.lzy.net:okgo:3.0.4'compile 'com.lzy.net:okrx2:2.0.2'compile 'com.lzy.net:okserver:2.0.5'compile 'com.jakewharton:butterknife:7.0.1'compile 'com.lzy.widget:imagepicker:0.3.2'

2.待下载列表:需检查sd权限


package com.example.downloadlistdemo;import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;import com.example.downloadlistdemo.base.BaseActivity;
import com.example.downloadlistdemo.model.FileModel;
import com.example.downloadlistdemo.utils.DownloadUtils;
import com.lzy.okgo.db.DownloadManager;
import com.lzy.okgo.model.Progress;
import com.lzy.okserver.OkDownload;import java.util.ArrayList;
import java.util.List;import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;public class DownloadListActivity extends BaseActivity {private static final int REQUEST_PERMISSION_STORAGE = 0x01;@Bind(R.id.toolbar)Toolbar toolbar;@Bind(R.id.targetFolder)TextView folder;@Bind(R.id.recyclerView)RecyclerView recyclerView;private List<FileModel> apks;private DownloadListAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_download_list);initToolBar(toolbar, false, "开始下载");initData();OkDownload.getInstance().setFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/aaa/");OkDownload.getInstance().getThreadPool().setCorePoolSize(3);folder.setText(String.format("下载路径: %s", OkDownload.getInstance().getFolder()));recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.setItemAnimator(new DefaultItemAnimator());recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));//从数据库中恢复数据List<Progress> progressList = DownloadManager.getInstance().getAll();OkDownload.restore(progressList);adapter = new DownloadListAdapter(this);recyclerView.setAdapter(adapter);checkSDCardPermission();}/** 检查SD卡权限 */protected void checkSDCardPermission() {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_STORAGE);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_PERMISSION_STORAGE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//获取权限} else {showToast("权限被禁止,无法下载文件!");}}}//    @OnClick(R.id.startAll)
//    public void startAll(View view) {
//        for (FileModel apk : apks) {
//
//            //这里只是演示,表示请求可以传参,怎么传都行,和okgo使用方法一样
//            GetRequest<File> request = OkGo.<File>get(apk.url)//
//                    .headers("aaa", "111")//
//                    .params("bbb", "222");
//
//            //这里第一个参数是tag,代表下载任务的唯一标识,传任意字符串都行,需要保证唯一,我这里用url作为了tag
//            OkDownload.request(apk.url, request)//
//                    .priority(apk.priority)//
//                    .extra1(apk)//
//                    .save()//
//                    .register(new LogDownloadListener())//
//                    .start();
//
//            adapter.notifyDataSetChanged();
//        }
//    }@Overrideprotected void onResume() {super.onResume();adapter.notifyDataSetChanged();}private class DownloadListAdapter extends BaseRecyclerAdapter<FileModel, ViewHolder> {DownloadListAdapter(Context context) {super(context, apks);}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = inflater.inflate(R.layout.item_download_list, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {FileModel fileModel = mDatas.get(position);holder.bind(fileModel);}}public class ViewHolder extends RecyclerView.ViewHolder {@Bind(R.id.name)TextView name;@Bind(R.id.icon)ImageView icon;@Bind(R.id.download)Button download;private FileModel apk;public ViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);}public void bind(FileModel apk) {this.apk = apk;if (OkDownload.getInstance().getTask(apk.url) != null) {//download.setText("已在队列");//download.setEnabled(false);} else {//download.setText("下载");//download.setEnabled(true);}name.setText(apk.name);displayImage(apk.iconUrl, icon);}@OnClick(R.id.download)public void download() {DownloadUtils.download(apk);}}private void initData() {apks = new ArrayList<>();FileModel apk1 = new FileModel();apk1.name = "pdf文件";apk1.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0c10c4c0155c9adf1282af008ed329378d54112ac";apk1.url = "http://www.ti.com.cn/cn/lit/ug/tidub07/tidub07.pdf";apks.add(apk1);FileModel apk2 = new FileModel();apk2.name = "视频文件";apk2.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/00814b5dad9b54cc804466369c8cb18f23e23823f";apk2.url = "http://vd3.bdstatic.com/mda-hkjm4bjixgj9t5km/mda-hkjm4bjixgj9t5km.mp4";apks.add(apk2);FileModel apk3 = new FileModel();apk3.name = "视频文件";apk3.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/01db44d7f809430661da4fff4d42e703007430f38";apk3.url = "http://vd3.bdstatic.com/mda-hkjm4bjixgj9t5km/mda-hkjm4bjixgj9t5km.mp4";apks.add(apk3);FileModel apk4 = new FileModel();apk4.name = "pdf文件";apk4.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/072725ca573700292b92e636ec126f51ba4429a50";apk4.url = "http://api.stepelectric.com/api/Pan/Down/434";apks.add(apk4);FileModel apk5 = new FileModel();apk5.name = "陌陌";apk5.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/06006948e655c4dd11862d060bd055b4fd2b5c41b";apk5.url = "http://api.stepelectric.com/SM.11SF-A (V4)UCMP检测子系统型式试验证书和报告.pdf";apks.add(apk5);FileModel apk6 = new FileModel();apk6.name = "手机淘宝";apk6.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/017a859792d09d7394108e0a618411675ec43f220";apk6.url = "http://121.29.10.1/f3.market.xiaomi.com/download/AppStore/0afc00452eb1a4dc42b20c9351eacacab4692a953/com.taobao.taobao.apk";apks.add(apk6);FileModel apk7 = new FileModel();apk7.name = "酷狗音乐";apk7.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0f2f050e21e42f75c7ecca55d01ac4e5e4e40ca8d";apk7.url = "http://121.18.239.1/f5.market.xiaomi.com/download/AppStore/053ed49c1545c6eec3e3e23b31568c731f940934f/com.kugou.android.apk";apks.add(apk7);FileModel apk8 = new FileModel();apk8.name = "网易云音乐";apk8.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/02374548ac39f3b7cdbf5bea4b0535b5d1f432f23";apk8.url = "http://121.18.239.1/f4.market.xiaomi.com/download/AppStore/0f458c5661acb492e30b808a2e3e4c8672e6b55e2/com.netease.cloudmusic.apk";apks.add(apk8);FileModel apk9 = new FileModel();apk9.name = "ofo共享单车";apk9.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0fe1a5c6092f3d9fa5c4c1e3158e6ff33f6418152";apk9.url = "http://60.28.125.1/f4.market.mi-img.com/download/AppStore/06954949fcd48414c16f726620cf2d52200550f56/so.ofo.labofo.apk";apks.add(apk9);FileModel apk10 = new FileModel();apk10.name = "摩拜单车";apk10.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0863a058a811148a5174d9784b7be2f1114191f83";apk10.url = "http://60.28.125.1/f4.market.xiaomi.com/download/AppStore/00cdeb4865c5a4a7d350fe30b9f812908a569cc8a/com.mobike.mobikeapp.apk";apks.add(apk10);FileModel apk11 = new FileModel();apk11.name = "贪吃蛇大作战";apk11.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/09f7f5756d9d63bb149b7149b8bdde0769941f09b";apk11.url = "http://60.22.46.1/f3.market.xiaomi.com/download/AppStore/0b02f24ffa8334bd21b16bd70ecacdb42374eb9cb/com.wepie.snake.new.mi.apk";apks.add(apk11);FileModel apk12 = new FileModel();apk12.name = "蘑菇街";apk12.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0ab53044735e842c421a57954d86a77aea30cc1da";apk12.url = "http://121.29.10.1/f5.market.xiaomi.com/download/AppStore/07a6ee4955e364c3f013b14055c37b8e4f6668161/com.mogujie.apk";apks.add(apk12);FileModel apk13 = new FileModel();apk13.name = "聚美优品";apk13.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/080ed520b76d943e5533017a19bc76d9f554342d0";apk13.url = "http://121.29.10.1/f5.market.mi-img.com/download/AppStore/0e70a572cd5fd6a3718941328238d78d71942aee0/com.jm.android.jumei.apk";apks.add(apk13);FileModel apk14 = new FileModel();apk14.name = "全民K歌";apk14.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0f1f653261ff8b3a64324097224e40eface432b99";apk14.url = "http://60.28.123.129/f4.market.xiaomi.com/download/AppStore/04f515e21146022934085454a1121e11ae34396ae/com.tencent.karaoke.apk";apks.add(apk14);FileModel apk15 = new FileModel();apk15.name = "书旗小说";apk15.iconUrl = "http://file.market.xiaomi.com/thumbnail/PNG/l114/AppStore/0c9ce345aa2734b1202ddf32b6545d9407b18ba0b";apk15.url = "http://60.28.125.129/f5.market.mi-img.com/download/AppStore/02d9c4035b248753314f46600cf7347a306426dc1/com.shuqi.controller.apk";apks.add(apk15);}
}

2. 点击下载调用下载工具类中下载:

package com.example.download.utils;import android.content.Context;import com.example.download.LogDownloadListener;
import com.example.download.model.CourseModel;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.request.GetRequest;
import com.lzy.okserver.OkDownload;import java.io.File;/*** Created by 付刚 on 2018/3/20.*/public class DownloadUtils {public static  void download(CourseModel courseModel) {//这里只是演示,表示请求可以传参,怎么传都行,和okgo使用方法一样GetRequest<File> request = OkGo.<File>get(courseModel.courseAddress)//.headers("aaa", "111")//.params("bbb", "222");//这里第一个参数是tag,代表下载任务的唯一标识,传任意字符串都行,需要保证唯一,我这里用courseAddress作为了tagOkDownload.request(courseModel.courseAddress, request)//.extra1(courseModel)//.save()//.register(new LogDownloadListener())//.start();}public static String getMIMEType(Context context, String filePath) {String type="";File file = new File(filePath);String fileName = file.getName();if(fileName.endsWith("pdf")){type="application/pdf";}else if (fileName.endsWith("mp4")){type="video/*";}else {type="video/*";}return type;}
}

3.展示下载列表及情况

package com.example.downloadlistdemo;import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.TextView;import com.example.downloadlistdemo.base.BaseActivity;
import com.lzy.okserver.OkDownload;
import com.lzy.okserver.task.XExecutor;import butterknife.Bind;public class DownloadingActivity extends BaseActivity implements XExecutor.OnAllTaskEndListener {private DownloadAdapter adapter;private OkDownload okDownload;@Bind(R.id.toolbar)Toolbar toolbar;@Bind(R.id.title)TextView title;@Bind(R.id.recyclerView)RecyclerView recyclerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_downloading);initToolBar(toolbar, true, "");title.setText("我的下载");okDownload = OkDownload.getInstance();adapter = new DownloadAdapter(this);adapter.updateData(DownloadAdapter.TYPE_ALL);recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.setAdapter(adapter);//okDownload.addOnAllTaskEndListener(this);}@Overridepublic void onAllTaskEnd() {showToast("所有下载任务已结束");}@Overrideprotected void onDestroy() {super.onDestroy();//okDownload.removeOnAllTaskEndListener(this);adapter.unRegister();}@Overridepublic void onBackPressed() {super.onBackPressed();finish();System.out.println("按下了back键   onBackPressed()");Log.e("fff", "按下了back键");}@Overrideprotected void onResume() {super.onResume();adapter.notifyDataSetChanged();}
}

adapter:


package com.example.downloadlistdemo;import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import android.support.v7.widget.RecyclerView;
import android.text.format.Formatter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.bumptech.glide.Glide;
import com.example.downloadlistdemo.model.FileModel;
import com.example.downloadlistdemo.utils.FileUtils;
import com.lzy.okgo.db.DownloadManager;
import com.lzy.okgo.model.Progress;
import com.lzy.okserver.OkDownload;
import com.lzy.okserver.download.DownloadListener;
import com.lzy.okserver.download.DownloadTask;import java.io.File;
import java.text.NumberFormat;
import java.util.List;
import java.util.Map;import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;public class DownloadAdapter extends RecyclerView.Adapter<DownloadAdapter.ViewHolder> {public static final int TYPE_ALL = 0;public static final int TYPE_FINISH = 1;public static final int TYPE_ING = 2;private List<DownloadTask> values;private NumberFormat numberFormat;private LayoutInflater inflater;private Context context;private int type;public DownloadAdapter(Context context) {this.context = context;numberFormat = NumberFormat.getPercentInstance();numberFormat.setMinimumFractionDigits(2);inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public void updateData(int type) {//这里是将数据库的数据恢复this.type = type;if (type == TYPE_ALL) values = OkDownload.restore(DownloadManager.getInstance().getAll());if (type == TYPE_FINISH)values = OkDownload.restore(DownloadManager.getInstance().getFinished());if (type == TYPE_ING)values = OkDownload.restore(DownloadManager.getInstance().getDownloading());notifyDataSetChanged();}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = inflater.inflate(R.layout.item_download_manager, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {DownloadTask task = values.get(position);String tag = createTag(task);task.register(new ListDownloadListener(tag, holder))//.register(new LogDownloadListener());holder.setTag(tag);holder.setTask(task);holder.bind();holder.refresh(task.progress);}public void unRegister() {Map<String, DownloadTask> taskMap = OkDownload.getInstance().getTaskMap();for (DownloadTask task : taskMap.values()) {task.unRegister(createTag(task));}}private String createTag(DownloadTask task) {return type + "_" + task.progress.tag;}@Overridepublic int getItemCount() {return values == null ? 0 : values.size();}public class ViewHolder extends RecyclerView.ViewHolder {@Bind(R.id.icon)ImageView icon;@Bind(R.id.name)TextView name;@Bind(R.id.downloadSize)TextView downloadSize;@Bind(R.id.tvProgress)TextView tvProgress;@Bind(R.id.netSpeed)TextView netSpeed;@Bind(R.id.pbProgress)NumberProgressBar pbProgress;@Bind(R.id.start)Button download;private DownloadTask task;private String tag;public ViewHolder(View itemView) {super(itemView);ButterKnife.bind(this, itemView);}public void setTask(DownloadTask task) {this.task = task;}public void bind() {Progress progress = task.progress;FileModel apk = (FileModel) progress.extra1;if (apk != null) {Glide.with(context).load(apk.iconUrl).error(R.mipmap.ic_launcher).into(icon);name.setText(apk.name);} else {name.setText(progress.fileName);}//itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Progress progress = task.progress;if (progress.status == Progress.FINISH) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(Intent.ACTION_VIEW);String type = FileUtils.getMIMEType(context, progress.filePath);File file = new File(progress.filePath);//设置intent的data和Type属性。Log.e("fff", "" + type + "11" + Uri.fromFile(file));Uri url = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.setDataAndType(url, type);context.startActivity(intent);}}});}public void refresh(Progress progress) {String currentSize = Formatter.formatFileSize(context, progress.currentSize);String totalSize = Formatter.formatFileSize(context, progress.totalSize);downloadSize.setText(currentSize + "/" + totalSize);switch (progress.status) {case Progress.NONE:netSpeed.setText("停止");download.setText("下载");break;case Progress.PAUSE:netSpeed.setText("暂停中");download.setText("继续");break;case Progress.ERROR:netSpeed.setText("下载出错");download.setText("出错");break;case Progress.WAITING:netSpeed.setText("等待中");download.setText("等待");break;case Progress.FINISH:netSpeed.setText("下载完成");download.setText("完成");break;case Progress.LOADING:String speed = Formatter.formatFileSize(context, progress.speed);netSpeed.setText(String.format("%s/s", speed));download.setText("暂停");break;}tvProgress.setText(numberFormat.format(progress.fraction));pbProgress.setMax(10000);pbProgress.setProgress((int) (progress.fraction * 10000));}@OnClick(R.id.start)public void start() {Progress progress = task.progress;switch (progress.status) {case Progress.PAUSE:case Progress.NONE:case Progress.ERROR:task.start();break;case Progress.LOADING:task.pause();break;case Progress.FINISH:Toast.makeText(context, "下载完成:" + progress.filePath, Toast.LENGTH_LONG).show();break;}refresh(progress);}@OnClick(R.id.remove)public void remove() {task.remove(true);updateData(type);}@OnClick(R.id.restart)public void restart() {task.restart();}public void setTag(String tag) {this.tag = tag;}public String getTag() {return tag;}}private class ListDownloadListener extends DownloadListener {private ViewHolder holder;ListDownloadListener(Object tag, ViewHolder holder) {super(tag);this.holder = holder;}@Overridepublic void onStart(Progress progress) {}@Overridepublic void onProgress(Progress progress) {if (tag == holder.getTag()) {holder.refresh(progress);}}@Overridepublic void onError(Progress progress) {Throwable throwable = progress.exception;if (throwable != null) throwable.printStackTrace();}@Overridepublic void onFinish(File file, Progress progress) {Toast.makeText(context, "下载完成:" + progress.filePath, Toast.LENGTH_LONG).show();updateData(type);}@Overridepublic void onRemove(Progress progress) {}}}

其中下载完成点击item会自动询问手机相关应用打开下载后的文件

使用的fileprovider

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.downloadlistdemo"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><applicationandroid:name=".GApp"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".DownloadingActivity"android:theme="@style/AppTheme.NoActionBar"></activity><activityandroid:name=".DownloadListActivity"android:theme="@style/AppTheme.NoActionBar"></activity></application></manifest>

功能基本上实现,还有okgo的初始化可参考网址https://github.com/jeasonlzy/okhttp-OkGo

附上上述demo:https://download.csdn.net/download/fugang1230/10313806

okGo框架的使用,下载列表显示相关推荐

  1. Andriod studio 学习 之 OkGo框架

    OkGo框架 用来处理网络请求的框架 功能:上传,下载 OkGo主要功能 基本的get.post.put.delete.head.options.trace.patch八种请求 支持upString, ...

  2. 利用Xutils框架进行断点续传下载

    前面有两篇博文主要介绍了如何利用volley获取所有cookie信息和自定义一个request, 地址如下: Volley 添加Cookie和获取服务器返回的一条或多条Cookie 继承Volley的 ...

  3. 微信小程序:笑话与趣图框架源码下载

    这是一款以笑话和趣味图为主的一款微信小程序源码 或者也可以说是一个框架吧 里面的内容是内置在小程序里面的,所以说是一款框架也可以 因为内置的内容,所以内容数量有限! 大家可以用来养账号,或者有能力的二 ...

  4. Android应用源码商城商品交易客户端小框架源码下载

    Android应用源码商城商品交易客户端小框架源码下载 项目源码下载地址:https://download.csdn.net/download/meimeieee/20939837 项目截图:

  5. android项目集成okgo,Android中MVP+RXJAVA+OKGO框架

    [实例简介] Android中MVP+RXJAVA+OKGO框架 Glide的封装 沉浸式状态栏 butterknife 和recyclerview的使用 [实例截图] [核心代码] 882096ee ...

  6. 什么是 PureMVC 框架(提供下载)

    PureMVC是在基础的经典模型.视图和控制器上建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex.Flash和AIR,现在已经 ...

  7. 深度学习框架 各种模型下载集合 -- models list

    在Ubuntu的终端中输入对应代码,获取对应模型 1. Inception-v3 model(<tensorflow 实战google 深度学习框架>) wget http://downl ...

  8. ABP框架—从项目下载到运行详细讲解

    ABP的学习网站我目前是使用两个,两个网站的文档内容有些是互补的,可以帮助我们更详细的学习 1.  https://www.abp.io/ 2.  https://aspnetboilerplate. ...

  9. Asp.net Ajax框架教程[教程下载]

    Asp.net Ajax 框架教程 目录 (一).概述... (二).应用场景代码示例... 1).ScriptManager控件示例...      1. 在异步调用服务端注册客户端脚本新方法... ...

最新文章

  1. Git的撤销操作 git reset HEAD -- <file>
  2. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
  3. OpenCASCADE:使用 扩展数据交换XDE之编辑形状
  4. 怎么改变github的用户名字,身份?
  5. session.merge 缓存不更新_这几个缓存更新的设计你都知道吗?
  6. android studio——替换全局的某个字符串
  7. 非涉密计算机检查的通知,关于开展非涉密计算机及可移动存储介质专项清理活动的紧急通知...
  8. springboot如何对本地数据库增删改查_SpringBoot整合Mybatis实现数据库增删改查
  9. OFD文件结构--Signatures.xml
  10. mapreduce 多种输入
  11. 谈谈可视化编程 (转)
  12. 多行文字cad提取数据_怎样从cad中提取excel表格数据-如何快速提取CAD图纸表格数据...
  13. uni-app微信小程序——商城(6)——我的主页
  14. 关于扫雷的c语言程序设计,C语言程序设计扫雷游戏实验报告
  15. python控制手机模拟器_Appium+python自动化23-Android夜神模拟器
  16. 图像mnf正变换_基于MNF 变换的多元变化检测变化信息的集中
  17. linux带source地址ping,实战经验:Linux Source NAT在Ping场景下的应用
  18. 期货贴水如何交割(期货交割升贴水)
  19. RDKit|分子指纹提取、相似性比较及应用
  20. Vue学习——Uncaught TypeError: “i“ is read-only

热门文章

  1. matlab中求矩阵的迹,求Matlab中矩阵的秩和迹
  2. matlab 发布商,MathWork发布MATLAB和Simulink版本2021a
  3. 键盘定位板图纸_DIY如何自制专属GH60机械键盘教程【步骤详解】
  4. 抖音矩阵系统,抖音矩阵系统源码,抖音SEO源码独立部署。
  5. 水果店毛利点计算公式,水果店月度毛利怎么算
  6. Back Propagation Derivation
  7. 第五人格亚服服务器不稳定,【关于第五人格网络问题的部分原因及解决方法】...
  8. 服务器内存UDIMM与RDIMM区别
  9. python之路金角大王_Python 之路03 - Python基础3
  10. JavaScript求最大的岛屿面积