第一步 :导依赖
compile 'com.youth.banner:banner:1.4.9' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:recyclerview-v7:26.+' compile 'org.easybatch:easybatch-gson:5.1.0' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.squareup.okio:okio:1.13.0' compile 'fm.jiecao:jiecaovideoplayer:5.5'
《清单文件》
<activity android:name=".activity.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
第二步:网络加权限
<uses-permission android:name="android.permission.INTERNET"
第三步:封装retrofit+Rxjava
建一个Net 工具包
get 请求
RequestApi
package com.example.snmsung.disanzhoukaomonidemo.net; import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean; import retrofit2.http.GET; import rx.Observable; public interface RequestApi { public static final String BASE_URL = "根据需求"; @GET("根据需求") Observable<MyBean> getData(); }
RetrofitUtlie
package com.example.snmsung.disanzhoukaomonidemo.net; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitUtlie { public static RequestApi doHttpdeal() { OkHttpClient Client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) //.addNetworkInterceptor(new MyInterceptro()) .build(); Retrofit retrofit = new Retrofit.Builder() .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(Client) .baseUrl(RequestApi.BASE_URL) .build(); RequestApi api = retrofit.create(RequestApi.class); return api; } }
第四步:建Bean类
MyBean
import java.util.List; public class MyBean { private int code; private String msg; private List<DataBean> data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private String content; private int id; private String image_url; private String title; private int type; private String vedio_url; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getImage_url() { return image_url; } public void setImage_url(String image_url) { this.image_url = image_url; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getVedio_url() { return vedio_url; } public void setVedio_url(String vedio_url) { this.vedio_url = vedio_url; } } }第五部:适配器Adapter RecyclerView的
MyAdapter
package com.example.snmsung.disanzhoukaomonidemo.Adapter; import android.content.Context; import android.content.SharedPreferences; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean; import com.example.snmsung.disanzhoukaomonidemo.R; import java.util.List; import static android.content.Context.MODE_PRIVATE; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> implements View.OnClickListener { private Context context; private List<MyBean.DataBean> data; private MyHolder myHolder; private OnItemClickListener mOnItemClickListener1 = null; private OnItemClickListener mOnItemClickListener = null; @Override public void onClick(View view) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取position mOnItemClickListener.onItemClick(view, (int) view.getTag()); SharedPreferences sfp=context.getSharedPreferences("user",MODE_PRIVATE); sfp.edit().putString("url",data.get((int) view.getTag()).getVedio_url()).commit(); } } public static interface OnItemClickListener { void onItemClick(View view, int position); } public MyAdapter(Context context, List<MyBean.DataBean> list1) { this.context = context; this.data = list1; } @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item, null); myHolder = new MyHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return myHolder; } @Override public void onBindViewHolder(MyHolder holder, int position) { holder.textView.setText(data.get(position).getTitle()); Glide.with(context).load(data.get(position).getImage_url()).into(holder.imageView); //将position保存在itemView的Tag中,以便点击时进行获取 myHolder.itemView.setTag(position); } public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } @Override public int getItemCount() { return data == null ? 0 : data.size(); } public class MyHolder extends RecyclerView.ViewHolder { private final ImageView imageView; private final TextView textView; public MyHolder(View itemView) { super(itemView); imageView = (ImageView) itemView.findViewById(R.id.img); textView = (TextView) itemView.findViewById(R.id.tv); } } }BaseAdapter的
package com.example.snmsung.disanzhoukaomonidemo.Adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean; import com.example.snmsung.disanzhoukaomonidemo.R; import java.util.List; import static android.R.id.list; public class MyAdapter1 extends BaseAdapter{ List<MyBean.DataBean> list1; private Context context; private MyViewHolder myViewHolder; public MyAdapter1(Context context, List<MyBean.DataBean> list1) { this.context=context; this.list1=list1; } @Override public int getCount() { return list1==null?0:list1.size(); } @Override public Object getItem(int i) { return list1.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { if (convertView==null){ convertView=View.inflate(context, R.layout.item1,null); myViewHolder = new MyViewHolder(); myViewHolder.imageView=(ImageView) convertView.findViewById(R.id.img1); convertView.setTag(myViewHolder); }else{ myViewHolder= (MyViewHolder) convertView.getTag(); } Glide.with(context).load(list1.get(i).getImage_url()).into(myViewHolder.imageView); return convertView; } public class MyViewHolder{ ImageView imageView; } }第六步:建一个Utiles工具包
DialogUtilspackage com.example.snmsung.disanzhoukaomonidemo.Utlies; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.SystemClock; import android.util.Log; import com.example.snmsung.disanzhoukaomonidemo.activity.ShiPinBoFang; import java.io.File; import java.io.IOException; import static android.content.Context.MODE_APPEND; public class DialogUtils { private Context context; public static long MAX_SIZE = 0; public static long PROGRESS = -2; private static String userr; public static void showUpdataDialog(final Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("是否更新"); builder.setMessage("太旧了,更新吧"); builder.setNegativeButton("就不", null); builder.setPositiveButton("可以", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { SharedPreferences sharedPreferences = context.getSharedPreferences("user", MODE_APPEND); userr = sharedPreferences.getString("url", null); Log.i("=======asdsasdsa=======", "onClick: " + userr); new DownLoadThread(userr, context.getCacheDir() + "shipin.mp4").start(); showProgress(context); } }); builder.show(); } 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(); File file = new File(context.getCacheDir() + "/app-release.apk"); String command = "chmod " + "777" + " " + file.getPath(); Runtime runtime = Runtime.getRuntime(); try { runtime.exec(command); } catch (IOException e) { e.printStackTrace(); } Bundle bundle = new Bundle(); Intent intent = new Intent(context, ShiPinBoFang.class); bundle.putString("userr", userr); intent.putExtras(bundle); context.startActivity(intent); // // Intent intent = new Intent(Intent.ACTION_VIEW); 由于没有在Activity环境下启动Activity,设置下面的标签 // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // intent.setDataAndType(Uri.fromFile(file), // "application/vnd.android.package-archive"); // context.startActivity(intent); // } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); pd.setProgress(values[0]); } }.execute(); } }
DownLoadTask
package com.example.snmsung.disanzhoukaomonidemo.Utlies; 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() { super.run(); NetUtils.downloadFile(downLoadUrl,path,blockSize,startPosition); } }
DownLoadThread
package com.example.snmsung.disanzhoukaomonidemo.Utlies; public class DownLoadThread extends Thread{ private String downLoadUrl = ""; private String path; private int threadNum = 5; public DownLoadThread(String downLoadUrl, String path) { this.downLoadUrl = downLoadUrl; this.path = path; this.threadNum = threadNum; } @Override public void run() { int len = NetUtils.getFileLength(downLoadUrl); DialogUtils.MAX_SIZE = len; int blockSize = len / threadNum; for (int i = 0; i < threadNum; i++) { int startPosition = i * blockSize; if (i == threadNum - 1) { blockSize = len - blockSize * (threadNum - 1); } new DownLoadTask(downLoadUrl, path, blockSize, startPosition).start(); } } }
NetUtils
package com.example.snmsung.disanzhoukaomonidemo.Utlies; import android.util.Log; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; 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; } }MainActivity 类
package com.example.snmsung.disanzhoukaomonidemo.activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import com.example.snmsung.disanzhoukaomonidemo.Adapter.MyAdapter; import com.example.snmsung.disanzhoukaomonidemo.Bean.MyBean; import com.example.snmsung.disanzhoukaomonidemo.ImagGithub.ImgGithub; import com.example.snmsung.disanzhoukaomonidemo.R; import com.example.snmsung.disanzhoukaomonidemo.net.RetrofitUtlie; import com.youth.banner.Banner; import java.util.ArrayList; import java.util.List; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class MainActivity extends AppCompatActivity { private Banner banner; private List<String> list; private RecyclerView recyclerView; private MyAdapter myAdapter; private List<MyBean.DataBean> data1; private MyAdapter myAdapter1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 inidata(); recyclerView.setLayoutManager(new LinearLayoutManager(this)); } private void inidata() { banner = (Banner) findViewById(R.id.banner); recyclerView = (RecyclerView) findViewById(R.id.rec); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); banner.setImageLoader(new ImgGithub()); list = new ArrayList<>(); list.add("http://pic32.nipic.com/20130817/9745430_101836881000_2.jpg"); list.add("http://pic15.nipic.com/20110630/6322714_105943746342_2.jpg"); list.add("http://pic48.nipic.com/file/20140916/2531170_195153248000_2.jpg"); list.add("http://img.taopic.com/uploads/allimg/140626/240469-1406261S24553.jpg"); list.add("http://pic77.nipic.com/file/20150911/21721561_155058651000_2.jpg"); list.add("http://img4.duitang.com/uploads/item/201603/18/20160318103156_cziuY.jpeg"); banner.setImages(list); banner.start(); //网络请求 qingqiu(); } private void qingqiu() { RetrofitUtlie.doHttpdeal().getData() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<MyBean>() { @Override public void onCompleted() { Log.i("======", "onNext: "+data1); } @Override public void onError(Throwable e) { e.printStackTrace(); Log.i("====12===", "onNext: "+e.toString()); } @Override public void onNext(MyBean myBean) { data1 = myBean.getData(); Log.i("======3======", "onNext: "+data1); myAdapter1 = new MyAdapter(MainActivity.this, data1); recyclerView.setAdapter(myAdapter1); myAdapter1.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Intent intent=new Intent(MainActivity.this,ShiPin.class); startActivity(intent); } }); } }); } }ShiPin类
package com.example.snmsung.disanzhoukaomonidemo.activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.VideoView; import com.example.snmsung.disanzhoukaomonidemo.R; import com.example.snmsung.disanzhoukaomonidemo.Utlies.DialogUtils; import com.example.snmsung.disanzhoukaomonidemo.common.PlayerManager; public class ShiPin extends AppCompatActivity { private PlayerManager player; private VideoView video_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shi_pin); Intent intent=getIntent(); String vedio_url = intent.getStringExtra("url"); DialogUtils.showUpdataDialog(this); } }
ShiPinBoFang 类
package com.example.snmsung.disanzhoukaomonidemo.activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.MediaController; import android.widget.VideoView; import com.example.snmsung.disanzhoukaomonidemo.R; import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard; public class ShiPinBoFang extends AppCompatActivity { private JCVideoPlayerStandard jcVideoPlayerStandard; private VideoView video1; private VideoView vv_video; /* 使用VideoView+MediaController实现视频播放器 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shi_pin_bo_fang); video1 = (VideoView)findViewById(R.id.vidoView); Intent intent=getIntent(); String url = intent.getStringExtra("userr"); //设置播放的来源 video1.setVideoPath(url); //实例化媒体控制器 MediaController mediaController=new MediaController(this); mediaController.setMediaPlayer(video1); video1.setMediaController(mediaController); } // getSupportActionBar().setTitle("jiecaovideoplayer的使用"); // jcVideoPlayerStandard= (JCVideoPlayerStandard) findViewById(R.id.jiecao_Player); // jcVideoPlayerStandard.setUp(url,jcVideoPlayerStandard.SCREEN_LAYOUT_NORMAL,"视频标题"); // Log.i("**********asdfg********", "onCreate: "+url.toString()); // } // @Override // public void onBackPressed() { // if (JCVideoPlayer.backPress()){ // return; // } // super.onBackPressed(); // } // // @Override // protected void onPause() { // super.onPause(); // JCVideoPlayer.releaseAllVideos(); // } }Main 布局XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.snmsung.disanzhoukaomonidemo.activity.MainActivity"> <com.youth.banner.Banner android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="205dp" /> <android.support.v7.widget.RecyclerView android:id="@+id/rec" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </LinearLayout>Shipin 布局XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.snmsung.disanzhoukaomonidemo.activity.ShiPin"> <com.example.snmsung.disanzhoukaomonidemo.widget.media.IjkVideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
ShiPinBoFang布局 XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <VideoView android:id="@+id/vidoView" android:layout_width="match_parent" android:layout_height="match_parent"></VideoView> </LinearLayout>item XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/img" android:layout_width="120dp" android:layout_height="120dp" /> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25dp" /> </LinearLayout>
item1 XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 封装ImgGithub
package com.example.snmsung.disanzhoukaomonidemo.ImagGithub; import android.content.Context; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.youth.banner.loader.ImageLoader; public class ImgGithub extends ImageLoader{ @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load(path).into(imageView); } }
封装Okhttp
Okutil
package com.example.snmsung.disanzhoukaomonidemo.okhttp; import android.os.Handler; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; public class Okutil { private Handler handler=new Handler(); public Handler gerhanlder(){ return handler; } private static Okutil okutil=new Okutil(); private Okutil(){}; public static Okutil getinstans(){ return okutil; } private OkHttpClient okHttpClient; public void init(){ if (okHttpClient==null){ okHttpClient=new OkHttpClient.Builder().build(); } } public void doget(String url, Callback callback){ init(); Request request=new Request.Builder().addHeader("User-Agent","").url(url).build(); Call call=okHttpClient.newCall(request); call.enqueue(callback); } }
Okutilback
package com.example.snmsung.disanzhoukaomonidemo.okhttp; import android.os.Handler; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Request; import okhttp3.Response; public abstract class Okutilback implements Callback{ private Handler handler=Okutil.getinstans().gerhanlder(); public abstract void OnFild(Call call, IOException e); public abstract void OnSuccess(String request) throws Exception; @Override public void onFailure(final Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { OnFild(call, e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String str=response.body().string(); handler.post(new Runnable() { @Override public void run() { try { OnSuccess(str); } catch (Exception e) { e.printStackTrace(); } } }); } }
网络拦截器
package com.example.snmsung.disanzhoukaomonidemo; import android.util.Log; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; public class MyInterceptro implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request=chain.request(); Log.i("===url====", "intercept: "+request.url()); Log.i("====res_headers====", "intercept: "+request.headers()); Response res= chain.proceed(request); Log.i("=====req_headers===", "intercept: "+res.headers()); Log.i("====body=======", "intercept: "+res.body().string()); return res; } }