Adpter_showadpter
public class ShowAdapter extends RecyclerView.Adapter<ShowAdapter.MyViewHolder> implements View.OnClickListener{
private Context context;
private List<Beans.DataBean> chalist;
//利用接口回調實現點擊事件
//再實例,然后創建方法
private OnItemClickListener mOnItemClickListener = null;
//點擊事件
@Override
public void onClick(View view) {
if (mOnItemClickListener!=null){
mOnItemClickListener.onItemClick(view, (Integer) view.getTag());
}
}
public static interface OnItemClickListener {
void onItemClick(View view , int position);
}
public ShowAdapter(Context context, List<Beans.DataBean> chalist) {
this.context = context;
this.chalist = chalist;
Log.i("33333", "onBindViewHolder: "+chalist.size());
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=View.inflate(context, R.layout.rcy_item_line,null);
MyViewHolder holder=new MyViewHolder(view);
//調用點擊
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(chalist.get(position).getContent());
// String[] split = sousuolist.get(position).getImages().split("\\|");
// DraweeController ff= Fresco.newDraweeControllerBuilder()
// .setUri(String.valueOf(split[0]))
// .setAutoPlayAnimations(true)
// .build();
// holder.iv.setController(ff);
// String s =chalist.get(position).getList().get(0).getImages().split("\\|")[0];
DraweeController ff= Fresco.newDraweeControllerBuilder()
.setUri(chalist.get(position).getImage_url())
.setAutoPlayAnimations(true)
.build();
holder.iv.setController(ff);
//把條目的下標position設置給holder
holder.itemView.setTag(position);
//ImageLoader.getInstance().displayImage(list.get(position).getList().get(0).getImages(),holder.iv);
}
public void setmOnItemClickListener(OnItemClickListener listener){
this.mOnItemClickListener=listener;
}
@Override
public int getItemCount() {
return chalist.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
public TextView tv;
public SimpleDraweeView iv;
public MyViewHolder(View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
iv = itemView.findViewById(R.id.img);
}
}
}
Img
public class Img extends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
Glide.with(context)
.load(path)
.into(imageView);
}
}
model
public interface IModel {
void setObSerVer(Observer obSerVer);
}
public class MyModel implements IModel{
@Override
public void setObSerVer(Observer obSerVer) {
OkHttpClient okclient = new OkHttpClient.Builder().build();
RetrofitManager.getInstance(RequestApi.BASE_URL,okclient)
.setCreate(RequestApi.class)
.getData()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(obSerVer);
}
}
Presenter
public class MyPresenter {
IModel model;
Iview view;
public MyPresenter(Iview view) {
this.view = view;
model=new MyModel();
}
public void loadData(){
model.setObSerVer(new Observer<Beans>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
// Log.i("http:///", "onError: "+e);
}
@Override
public void onNext(Beans beans ) {
List<Beans.DataBean> data = beans.getData();
// Log.i("http://///", "onNext: "+list.size());
view.setData(data);
}
});
}
}
view
public interface Iview {
void setData(List<Beans.DataBean> beanList);
}
utils_Api
public class Api {
public static final String BanUrl="http://result.eolinker.com/iYXEPGn4e9c6dafce6e5cdd23287d2bb136ee7e9194d3e9?uri=vedio";
}
utils_DialogUtils
public class DialogUtils {
public static long MAX_SIZE = 0;
public static long PROGRESS = -2;
// private static File file;
private static String path;
public static void showUpdataDialog(final Context context){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("是否下載")
.setMessage("下載吧")
.setNegativeButton("以后再說", null)
.setPositiveButton("立即下載", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// path= context.getCacheDir() + "/uri=vedio";
// new DownloadThread("http://result.eolinker.com/iYXEPGn4e9c6dafce6e5cdd23287d2bb136ee7e9194d3e9?uri=vedio", context.getCacheDir() + "/uri=vedio").start();
path= context.getCacheDir() + "/911Mothers_2010W-480p.mp4";
new DownloadThread("http://mirror.aarnet.edu.au/pub/TED-talks/911Mothers_2010W-480p.mp4", context.getCacheDir() + "/911Mothers_2010W-480p.mp4").start();
showProgress(context);
}
}).show();
}
public static interface autopPlay {
void autopplay(String path);
}
public static autopPlay play;
public static void setPlay(autopPlay autopPlay){
play=autopPlay;
};
public static void showProgress(final Context context){
final ProgressDialog pd = new ProgressDialog(context);
pd.setTitle("正在下載");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100);
pd.show();
new AsyncTask<String, Integer, String>(){
@Override
protected String doInBackground(String... strings) {
while (PROGRESS+1 < MAX_SIZE){
SystemClock.sleep(100);
if (MAX_SIZE>0){
publishProgress((int)(PROGRESS * 100 / MAX_SIZE));
}
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
pd.dismiss();
play.autopplay(path);
// file=new File(context.getCacheDir() + "/911Mothers_2010W-480p.mp4");
// openApi(context,file);
Toast.makeText(context,"下載完成",Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pd.setProgress(values[0]);
}
}.execute();
}
}
utils_RequestApi
public static final String BASE_URL = "http://result.eolinker.com/";
@GET("iYXEPGn4e9c6dafce6e5cdd23287d2bb136ee7e9194d3e9?uri=vedio")
Observable<Beans> getData();
utils_RetrofitManager
public class RetrofitManager {
private Retrofit mRetrofit;
private String baseUrl;
OkHttpClient client;
private static RetrofitManager mRetrofitManager;
private RetrofitManager(String baseUrl,OkHttpClient client){
this.baseUrl=baseUrl;
this.client=client;
initRetrofit();
}
public static synchronized RetrofitManager getInstance(String baseUrl,OkHttpClient client){
if (mRetrofitManager == null){
mRetrofitManager = new RetrofitManager(baseUrl,client);
}
return mRetrofitManager;
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
}
public <T> T setCreate(Class<T> reqServer){
return mRetrofit.create(reqServer);
}
}
activity
public class ShowActivity extends AppCompatActivity implements Iview {
private Banner mBan;
List<String> list = new ArrayList<>();
private RecyclerView mRecy;
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化 Fresco
Fresco.initialize(this);
setContentView(R.layout.activity_show);
//隱藏標題
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
initView();
okUrlBanner();
MyPresenter presenter = new MyPresenter(this);
presenter.loadData();
}
private void initView() {
mBan = (Banner) findViewById(R.id.ban);
mRecy = (RecyclerView) findViewById(R.id.recy);
videoView= (VideoView) findViewById(R.id.video_view);
//創建布局管理器
LinearLayoutManager ll = new LinearLayoutManager(this);
mRecy.setLayoutManager(ll);
}
//Banner輪播
private void okUrlBanner() {
OkHttpUtils.getInstance().doGet(Api.BanUrl, new OnUiCallback() {
@Override
public void onFailed(Call call, IOException e) {
}
@Override
public void onSuccess(String result) throws IOException {
Gson gson = new Gson();
Beans beans = gson.fromJson(result, Beans.class);
for (int i = 0; i < beans.getData().size(); i++) {
list.add(beans.getData().get(i).getImage_url());
}
mBan.setImageLoader(new Img());
mBan.setImages(list);
mBan.start();
}
});
}
//請求數據
@Override
public void setData(List<Beans.DataBean> beanList) {
//創建適配器
ShowAdapter showAdapter = new ShowAdapter(ShowActivity.this, beanList);
mRecy.setAdapter(showAdapter);
//條目點擊
showAdapter.setmOnItemClickListener(new ShowAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(ShowActivity.this,"點擊下載播放",Toast.LENGTH_SHORT).show();
DialogUtils.showUpdataDialog(ShowActivity.this);
DialogUtils.setPlay(new DialogUtils.autopPlay() {
@Override
public void autopplay(String path) {
//播放視頻
Uri uri = Uri.parse(path);
videoView.setMediaController(new MediaController(ShowActivity.this));
videoView.setVideoURI(uri);
videoView.start();
videoView.requestFocus();
}
});
}
});
}
}
net_DownloadTask
public class DownloadTask extends Thread {
String downloadUrl;
String path;
int blockSize;
int startPosition;
public DownloadTask(String downloadUrl, String path, int blockSize, int startPosition) {
this.downloadUrl = downloadUrl;
this.path = path;
this.blockSize = blockSize;
this.startPosition = startPosition;
}
@Override
public void run() {
NetUtils.downloadFile(downloadUrl,path,blockSize,startPosition);
}
}
net_DownloadThread
public class DownloadThread extends Thread{
private String downloadUrl = "";
private String path;
private int threadNum = 4;
public DownloadThread(String downloadUrl, String path) {
this.downloadUrl = downloadUrl;
this.path = path;
}
@Override
public void run() {
int len = NetUtils.getFileLength(downloadUrl);
DialogUtils.MAX_SIZE = len;
//例如 1000kb 3 333
int blockSize = len/threadNum;
// //四舍五入--- 讓一個數字+0。5在四舍五入 就變成 向上取整
// int blockSize = (int) Math.round(tempSize + 0.5);
//計算出下載塊以后 創建線程執行下載操作
for (int i = 0; i < threadNum; i++) {
//計算開始位置
int startPosition = blockSize * i;
//讓最后一個線程下載的大小是正好的, 總長度 - 除了最后一個塊的大小和
if(i == threadNum - 1){
blockSize = len - blockSize * (threadNum - 1);
}
new DownloadTask(downloadUrl, path, blockSize, startPosition).start();
}
}
public void setThreadNum(int threadNum){
this.threadNum = threadNum;
}
}
net_NetUtils
public class NetUtils {
public static void downloadFile(String downloadUrl, String path, int blockSize, int startPosition){
BufferedInputStream bis = null;
RandomAccessFile raf = null;
try {
File f = new File(path);
if(!f.exists()){
f.createNewFile();
}
URL url = new URL(downloadUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(8000);
conn.setConnectTimeout(8000);
// long start = 0;
if(blockSize > 0){
// //使用線程id來計算 當前線程的開始位置和結束位置
// start = blockSize * threadId;
long end = blockSize + startPosition - 1;
//多線程下載 需要告訴服務器我要請求的是哪部分內容 需要寫在請求頭里面
conn.setRequestProperty("Range", "bytes=" + startPosition + "-" + end);
Log.i(Thread.currentThread() + "======", "bytes=" + startPosition + "-" + end);
}
int code = conn.getResponseCode();
if(code < 400){
bis = new BufferedInputStream(conn.getInputStream());
raf = new RandomAccessFile(f, "rwd");
raf.seek(startPosition);
int len = 0;
byte[] buff = new byte[1024 * 8];
while((len = bis.read(buff)) != -1){
synchronized (NetUtils.class){
raf.write(buff, 0, len);
if ( DialogUtils.PROGRESS<0){
DialogUtils.PROGRESS = 0;
}
DialogUtils.PROGRESS += len;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf != null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static int getFileLength(String downloadUrl){
int len = 0;
try {
URL url = new URL(downloadUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(8000);
conn.setConnectTimeout(8000);
len = conn.getContentLength();
} catch (Exception e) {
e.printStackTrace();
}
return len;
}
}
mvp+banner+rxjava+retrofit+多線程下載
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 原文地址: http://www.lxweimin.com/p/4bbecd0bb027 概述 MVPArms 是一...
- 背景 斷點續傳下載一直是移動開發中必不可少的一項重要的技術,同樣的Rxjava和Retrofit的結合讓這個技術解...
- 前言 Kotlin+Retrofit+RxJava+MVP封裝(一)Kotlin+Retrofit+RxJava+...
- 前言 首先,對于MVP、RxJava還不了解的同學,請先閱讀這幾篇文章: Android MVP模式 簡單易懂的介...