androidebook's People
androidebook's Issues
实现书籍历史和书籍分类
recycleview中textview设置selector报错误
设置selector参考https://www.jianshu.com/p/b047bc7c0cbd,上面这种方法会报错
考虑另外一种方法https://www.cnblogs.com/kim-liu/p/7681862.html,可行
viewPager的使用
ViewPager的简介和作用
ViewPager的适配器
ViewPager的翻页动画
简化ViewPager的使用
ViewPager结合第三方库实现小圆点指示器效果
ViewPager结合design库实现tab切换
基于ViewPager实现广告轮播控件
ViewPager 全面剖析及使用详解
CardView+ViewPager实现ViewPager翻页动画
如何上传头像
弹窗
android开源框架
分类页面如何实现
利用 toolbar来优化书架页面
书架批量删除和书架历史,和书籍分类
5/2
1.复试真题编程,和离散数学
2.书架批量删除和书架历史,和书籍分类
3.第二次阶段性报告
如何设置搜索框
登录界面的实现
因为使用的是qq第三方,所以不需要登录界面。
设置带阴影的图片
1.之前是用工具将图片加上阴影,可以实现
2.现在直接使用框架,将图片设置阴影效果
https://github.com/yingLanNull/ShadowImageView/blob/master/READEME_CN.md
recycleview没有监听事件,如何自己设置监听事件
修改书架
书架改为在本地数据库中进行存储,
数据库应该包括
1.书的编号,书的名称,书的作者,书的封面路径,书的文件路径
2.书的封面和文件路径放在本地文件夹里面
cardView来替代阴影效果
显示推荐图书1
1.在eclipse中设置文件夹,放入待显示的图片
2.在onCreateView中初始化
gridView=(LabelGridView)rootView.findViewById(R.id.id_book_gridview);
data_list = new ArrayList<Map<String, Object>>();
getDataByNet();
fragmentActivity=getActivity();
3.getDataByNet()
public void getDataByNet(){
new Thread(){
@Override
public void run() {
book_name_list3=new LinkedList<>();
book_post_list3=new LinkedList<>();
book_author_list3=new LinkedList<>();
book_post_name_list=new LinkedList<>();
for(int i=0;i<6;i++){
book_name_list3.add("爆裂无声"+i);
//book_post_list3.add(R.drawable.img_bookshelf_everybook);
book_author_list3.add("雨果");
book_post_name_list.add("http://192.168.1.4:8080/com.lianggao.whut/recommendImages/recommend"+(i+1)+".jpg");
}
Message msg=new Message();
Bitmap bitmap=null;
bitmapList= Util.getMultiBitMap(book_post_name_list);
for(int i=0;i<6;i++){
Map<String, Object> map = new HashMap<String, Object>();
map.put("book_post", bitmapList.get(i));
map.put("book_name", book_name_list3.get(i));
map.put("book_progress",book_author_list3.get(i));
data_list.add(map);
}
msg.obj=data_list;
msg.what=MSG_GET_MUTIBITMAP_SUCCESS;
handler.sendMessage(msg);
}
}.start();
}
4.3中Util.getMultiBitMap(book_post_name_list);的方法为在Util中新加入的方法
/**
* @description: 批量请求网络图片放入LinkedList集合返回
* @param: LinkedList<String>
* @return: LinkedList<Bitmap>
* @author: 梁高
* @time: 2020/4/16
*/
public static List<Bitmap> getMultiBitMap(List<String> mulitiBitMapList){
Bitmap bitmap=null;
URL url=null;
InputStream is =null;
HttpURLConnection conn=null;
List<Bitmap> bitmapLinkedList=new LinkedList<>();
Log.i("获取图片",mulitiBitMapList.size()+"");
for(int i=0;i<mulitiBitMapList.size();i++){
try {
url=new URL(mulitiBitMapList.get(i));
conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(true);
conn.setConnectTimeout(1000);
conn.setReadTimeout(1000);
conn.connect();
is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
bitmapLinkedList.add(bitmap);
Log.i("获取图片","获取图片成功");
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Log.i("获取图片","获取图片结束");
return bitmapLinkedList;
}
5.处理完成后进入handler中设置adapter
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case MSG_GET_MUTIBITMAP_SUCCESS:
Log.i("获取图片","批量获取图片成功");
sim_adapter = new SimpleAdapter(fragmentActivity, data_list,R.layout.part_activity_book_gridview_new, from, to);
sim_adapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object data, String textRepresentation) {
if(view instanceof ImageView &&data instanceof Bitmap){
ImageView iv=(ImageView)view;
iv.setImageBitmap((Bitmap)data);
return true;
}else{
return false;
}
}
});
gridView.setAdapter(sim_adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getContext(),"点击了gridview的第"+position+"个图书",Toast.LENGTH_LONG).show();
}
});
break;
}
}
};
使用picasso实现预先加载本地图片效果
recycleview根据滑动来部分加载数据
将QQ登录第三方集成到系统中
1.在Activity中进行唤醒登录
2.在Fragment中进行唤醒登录
参考链接1
参考链接2
如果在Fragment中使用,需要更改QQLoginManager中QQLoginManger初始化方法,
这是原来的
public QQLoginManager(String app_id, Object o) {
this.app_id = app_id;
this.mContext = (Context) o;
this.mActivity = (Activity) o;
this.qqLoginListener = (QQLoginListener) o;
initData();
}
这是新加的
public QQLoginManager(String app_id, Context context, Object o){//表示是通过Fragment
this.app_id=app_id;
this.mfragment=(Fragment) o;
this.mContext=context;
this.qqLoginListener=(QQLoginListener)o;
initData();
}
这样就能够区别是在Activity还是在Fragment中
如何将文本显示在页面上,并设置翻页效果
点击更多,跳转到图书列表
listview模拟下载
Android实现ProgressBar旋转菊花加载的动画
如何实现新书导入
封装okhttp进行请求
build中使用
implementation 'com.google.code.gson:gson:2.8.0'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
Activity中引用
import com.lianggao.whut.thirdtest.net.HttpCaller;
import com.lianggao.whut.thirdtest.net.NameValuePair;
import com.lianggao.whut.thirdtest.net.RequestDataCallback;
HttpCaller
package com.lianggao.whut.thirdtest.net;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import com.lianggao.whut.thirdtest.entity.HttpConfig;
import com.lianggao.whut.thirdtest.util.Util;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.TimeUnit;
/*import io.github
import io.github.lizhangqu.coreprogress.ProgressHelper;
import io.github.lizhangqu.coreprogress.ProgressUIListener;*/
import io.github.lizhangqu.coreprogress.ProgressHelper;
import io.github.lizhangqu.coreprogress.ProgressUIListener;
import okhttp3.CacheControl;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.BufferedSink;
import okio.BufferedSource;
import okio.Okio;
/**
* HTTP请求发起和数据解析转换
* Created by ansen
* Create Time 2014年9月18日 下午9:24:50
* update time 2017-06-10
*/
public class HttpCaller {
private static HttpCaller _instance = null;
private OkHttpClient client;//okhttp对象
private Map<String,Call> requestHandleMap = new HashMap<>();//以URL为KEY存储的请求
private CacheControl cacheControl = null;//缓存控制器
private Gson gson = new Gson();
private HttpConfig httpConfig=new HttpConfig();//配置信息
private HttpCaller() {}
public static HttpCaller getInstance(){
if (_instance == null) {
_instance = new HttpCaller();
}
return _instance;
}
/**
* 设置配置信息 这个方法必需要调用一次
* @param httpConfig
*/
public void setHttpConfig(HttpConfig httpConfig) {
this.httpConfig = httpConfig;
client = new OkHttpClient.Builder()
.connectTimeout(httpConfig.getConnectTimeout(), TimeUnit.SECONDS)
.writeTimeout(httpConfig.getWriteTimeout(), TimeUnit.SECONDS)
.readTimeout(httpConfig.getReadTimeout(), TimeUnit.SECONDS)
.build();
gson = new Gson();
requestHandleMap = Collections.synchronizedMap(new WeakHashMap<String, Call>());
cacheControl =new CacheControl.Builder().noStore().noCache().build();//不使用缓存
}
public <T> void get(Class<T> clazz,final String url,final RequestDataCallback<T> callback) {
this.get(clazz,url,null,callback,true);
}
public <T> void get(Class<T> clazz,final String url,Header[] header,final RequestDataCallback<T> callback) {
this.get(clazz,url,header,callback,true);
}
/**
* get请求
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param callback 回调接口
* @param autoCancel 是否自动取消 true:同一时间请求一个接口多次 只保留最后一个
* @param <T>
*/
public <T> void get(final Class<T> clazz,final String url,Header[] header,final RequestDataCallback<T> callback, boolean autoCancel){
if (checkAgent()) {
return;
}
add(url,getBuilder(url, header, new MyHttpResponseHandler(clazz,url,callback)),autoCancel);
}
private Call getBuilder(String url, Header[] header, HttpResponseHandler responseCallback) {
url=Util.getMosaicParameter(url,httpConfig.getCommonField());//拼接公共参数
// Log.i("ansen","访问的url"+url);
Request.Builder builder = new Request.Builder();
builder.url(url);
builder.get();
return execute(builder, header, responseCallback);
}
public <T> T getSync(Class<T> clazz, String url){
return getSync(clazz,url,null);
}
public <T> T getSync(Class<T> clazz, String url, Header[] header) {
if (checkAgent()) {
return null;
}
url=Util.getMosaicParameter(url,httpConfig.getCommonField());//拼接公共参数
Request.Builder builder = new Request.Builder();
builder.url(url);
builder.get();
byte[] bytes = execute(builder,header);
try {
String str = new String(bytes, "utf-8");
if (clazz != null) {
T t = gson.fromJson(str, clazz);
System.out.println(t);
return t;
}
} catch (Exception e) {
printLog("getSync HTTPCaller:" + e.toString());
}
return null;
}
public <T> void post(final Class<T> clazz,final String url, List<NameValuePair> params, RequestDataCallback<T> callback) {
this.post(clazz,url, null, params, callback,true);
}
public <T> void post(final Class<T> clazz,final String url, Header[] header, List<NameValuePair> params, RequestDataCallback<T> callback) {
this.post(clazz,url, header, params, callback,true);
}
/**
*
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param params 参数
* @param callback 回调
* @param autoCancel 是否自动取消 true:同一时间请求一个接口多次 只保留最后一个
* @param <T>
*/
public <T> void post(final Class<T> clazz,final String url, Header[] header, final List<NameValuePair> params, final RequestDataCallback<T> callback, boolean autoCancel) {
if (checkAgent()) {
return;
}
add(url,postBuilder(url, header, params, new MyHttpResponseHandler(clazz,url,callback)),autoCancel);
}
public <T> T postSync(Class<T> clazz, String url, List<NameValuePair> form) {
return postSync(clazz,url,form,null);
}
public <T> T postSync(Class<T> clazz, String url, List<NameValuePair> form,Header[] header) {
if (checkAgent()) {
return null;
}
// Log.i("ansen","url:"+url);
Request.Builder builder=getRequestBuild(url,form);
byte[] bytes = execute(builder,header);
try {
String result = new String(bytes, "utf-8");
if (clazz != null && !TextUtils.isEmpty(result)) {
T t = gson.fromJson(result,clazz);
return t;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public byte[] postSync(String url,List<NameValuePair> form){
return postSync(url,form);
}
public byte[] postSync(String url,List<NameValuePair> form,Header[] header) {
if (checkAgent()) {
return null;
}
Request.Builder builder=getRequestBuild(url,form);
return execute(builder, header);
}
private Call postBuilder(String url, Header[] header, List<NameValuePair> form, HttpResponseHandler responseCallback) {
try {
Request.Builder builder=getRequestBuild(url,form);
return execute(builder, header, responseCallback);
} catch (Exception e) {
if (responseCallback != null)
responseCallback.onFailure(-1, e.getMessage().getBytes());
}
return null;
}
private Request.Builder getRequestBuild(String url,List<NameValuePair> form){
if(form==null){
form=new ArrayList<>();
}
form.addAll(httpConfig.getCommonField());//添加公共字段
FormBody.Builder formBuilder = new FormBody.Builder();
for (NameValuePair item : form) {
if(TextUtils.isEmpty(item.getValue())){
printLog("字段:"+item.getName()+"的值为null");
continue;
}
formBuilder.add(item.getName(),item.getValue());
}
RequestBody requestBody = formBuilder.build();
Request.Builder builder = new Request.Builder();
builder.url(url);
builder.post(requestBody);
return builder;
}
/**
* 上传文件
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param form 请求参数
* @param callback 回调
* @param <T>
*/
public <T> void postFile(final Class<T> clazz, final String url, Header[] header,List<NameValuePair> form,final RequestDataCallback<T> callback) {
postFile(url, header, form, new MyHttpResponseHandler(clazz,url,callback),null);
}
/**
* 上传文件
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param form 请求参数
* @param callback 回调
* @param progressUIListener 上传文件进度
* @param <T>
*/
public <T> void postFile(final Class<T> clazz, final String url, Header[] header,List<NameValuePair> form,final RequestDataCallback<T> callback,ProgressUIListener progressUIListener) {
add(url, postFile(url, header, form, new MyHttpResponseHandler(clazz,url,callback),progressUIListener));
}
/**
* 上传文件
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param name 名字
* @param fileName 文件名
* @param fileContent 文件内容
* @param callback 回调
* @param <T>
*/
public <T> void postFile(final Class<T> clazz,final String url,Header[] header,String name,String fileName,byte[] fileContent,final RequestDataCallback<T> callback){
postFile(clazz,url,header,name,fileName,fileContent,callback,null);
}
/**
* 上传文件
* @param clazz json对应类的类型
* @param url 请求url
* @param header 请求头
* @param name 名字
* @param fileName 文件名
* @param fileContent 文件内容
* @param callback 回调
* @param progressUIListener 回调上传进度
* @param <T>
*/
public <T> void postFile(Class<T> clazz,final String url,Header[] header,String name,String fileName,byte[] fileContent,final RequestDataCallback<T> callback,ProgressUIListener progressUIListener) {
add(url,postFile(url, header,name,fileName,fileContent,new MyHttpResponseHandler(clazz,url,callback),progressUIListener));
}
// 不带字节的上传
private Call postFile(String url, Header[] header,List<NameValuePair> form,HttpResponseHandler responseCallback,ProgressUIListener progressUIListener){
try {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
MediaType mediaType = MediaType.parse("application/octet-stream");
form.addAll(httpConfig.getCommonField());//添加公共字段
for(int i=form.size()-1;i>=0;i--){
NameValuePair item = form.get(i);
if(item.isFile()){//上传文件
File myFile = new File(item.getValue());
if (myFile.exists()){
String fileName = Util.getFileName(item.getValue());
builder.addFormDataPart(item.getName(), fileName,RequestBody.create(mediaType, myFile));
}
}else{
builder.addFormDataPart(item.getName(), item.getValue());
}
}
RequestBody requestBody;
if(progressUIListener==null){//不需要回调进度
requestBody=builder.build();
}else{//需要回调进度
requestBody = ProgressHelper.withProgress(builder.build(),progressUIListener);
}
Request.Builder requestBuider = new Request.Builder();
requestBuider.url(url);
requestBuider.post(requestBody);
return execute(requestBuider, header, responseCallback);
} catch (Exception e) {
e.printStackTrace();
Log.e(httpConfig.getTagName(),e.toString());
if (responseCallback != null)
responseCallback.onFailure(-1, e.getMessage().getBytes());
}
return null;
}
//带有字节的上传
private Call postFile(String url, Header[] header,String name,String filename,byte[] fileContent, HttpResponseHandler responseCallback,ProgressUIListener progressUIListener) {
try {
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
MediaType mediaType = MediaType.parse("application/octet-stream");
builder.addFormDataPart(name,filename,RequestBody.create(mediaType, fileContent));
List<NameValuePair> form = new ArrayList<>(2);
form.addAll(httpConfig.getCommonField());//添加公共字段
for (NameValuePair item : form) {
builder.addFormDataPart(item.getName(),item.getValue());
}
RequestBody requestBody;
if(progressUIListener==null){//不需要回调进度
requestBody=builder.build();
}else{//需要回调进度
requestBody = ProgressHelper.withProgress(builder.build(),progressUIListener);
}
Request.Builder requestBuider = new Request.Builder();
requestBuider.url(url);
requestBuider.post(requestBody);
return execute(requestBuider, header,responseCallback);
} catch (Exception e) {
if (httpConfig.isDebug()) {
e.printStackTrace();
Log.e(httpConfig.getTagName(), e.toString());
}
if (responseCallback != null)
responseCallback.onFailure(-1, e.getMessage().getBytes());
}
return null;
}
public void downloadFile(String url,String saveFilePath, Header[] header,ProgressUIListener progressUIListener) {
downloadFile(url,saveFilePath, header, progressUIListener,true);
}
public void downloadFile(String url,String saveFilePath, Header[] header,ProgressUIListener progressUIListener,boolean autoCancel) {
if (checkAgent()) {
return;
}
add(url,downloadFileSendRequest(url,saveFilePath, header, progressUIListener),autoCancel);
}
private Call downloadFileSendRequest(String url,final String saveFilePath,Header[] header,final ProgressUIListener progressUIListener){
Request.Builder builder = new Request.Builder();
builder.url(url);
builder.get();
return execute(builder, header, new DownloadFileResponseHandler(url,saveFilePath,progressUIListener));
}
//异步执行
private Call execute(Request.Builder builder, Header[] header, Callback responseCallback) {
Call call = getCall(builder, header);
if (call != null) {
call.enqueue(responseCallback);
}
return call;
}
//同步执行
private byte[] execute(Request.Builder builder, Header[] header) {
Call call = getCall(builder, header);
byte[] body = "".getBytes();
try {
Response response = call.execute();
body = response.body().bytes();
} catch (Exception e) {
e.printStackTrace();
}
return body;
}
private Call getCall(Request.Builder builder, Header[] header) {
boolean hasUa = false;
if (header == null) {
builder.header("Connection","close");
builder.header("Accept", "*/*");
} else {
for (Header h : header) {
builder.header(h.getName(), h.getValue());
if (!hasUa && h.getName().equals("User-Agent")) {
hasUa = true;
}
}
}
if (!hasUa&&!TextUtils.isEmpty(httpConfig.getUserAgent())){
builder.header("User-Agent",httpConfig.getUserAgent());
}
Request request = builder.build();
client=new OkHttpClient();
//builder.cacheControl(new CacheControl.Builder().noCache().build()).build();
return client.newCall(request);
}
public class DownloadFileResponseHandler implements Callback{
private String saveFilePath;
private ProgressUIListener progressUIListener;
private String url;
public DownloadFileResponseHandler(String url,String saveFilePath,ProgressUIListener progressUIListener){
this.url=url;
this.saveFilePath=saveFilePath;
this.progressUIListener=progressUIListener;
}
@Override
public void onFailure(Call call, IOException e) {
clear(url);
try {
printLog(url + " " + -1 + " " + new String(e.getMessage().getBytes(), "utf-8"));
} catch (UnsupportedEncodingException encodingException) {
encodingException.printStackTrace();
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
printLog(url + " code:" + response.code());
clear(url);
ResponseBody responseBody = ProgressHelper.withProgress(response.body(),progressUIListener);
BufferedSource source = responseBody.source();
File outFile = new File(saveFilePath);
outFile.delete();
outFile.createNewFile();
BufferedSink sink = Okio.buffer(Okio.sink(outFile));
source.readAll(sink);
sink.flush();
source.close();
}
}
public class MyHttpResponseHandler<T> extends HttpResponseHandler {
private Class<T> clazz;
private String url;
private RequestDataCallback<T> callback;
public MyHttpResponseHandler(Class<T> clazz,String url,RequestDataCallback<T> callback){
this.clazz=clazz;
this.url=url;
this.callback=callback;
}
@Override
public void onFailure(int status, byte[] data) {
clear(url);
try {
printLog(url + " " + status + " " + new String(data, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
sendCallback(callback);
}
@Override
public void onSuccess(int status,final Header[] headers, byte[] responseBody) {
try {
clear(url);
String str = new String(responseBody,"utf-8");
printLog(url + " " + status + " " + str);
T t = gson.fromJson(str, clazz);
sendCallback(status,t,responseBody,callback);
} catch (Exception e){
if (httpConfig.isDebug()) {
e.printStackTrace();
printLog("自动解析错误:" + e.toString());
}
sendCallback(callback);
}
}
}
private void autoCancel(String function){
Call call = requestHandleMap.remove(function);
if (call != null) {
call.cancel();
}
}
private void add(String url,Call call) {
add(url,call,true);
}
/**
* 保存请求信息
* @param url 请求url
* @param call http请求call
* @param autoCancel 自动取消
*/
private void add(String url,Call call,boolean autoCancel) {
if (!TextUtils.isEmpty(url)){
if (url.contains("?")) {//get请求需要去掉后面的参数
url=url.substring(0,url.indexOf("?"));
}
if(autoCancel){
autoCancel(url);//如果同一时间对api进行多次请求,自动取消之前的
}
requestHandleMap.put(url,call);
}
}
private void clear(String url){
if (url.contains("?")) {//get请求需要去掉后面的参数
url=url.substring(0,url.indexOf("?"));
}
requestHandleMap.remove(url);
}
private void printLog(String content){
if(httpConfig.isDebug()){
Log.i(httpConfig.getTagName(),content);
}
}
/**
* 检查代理
* @return
*/
private boolean checkAgent() {
if (httpConfig.isAgent()){
return false;
} else {
String proHost = android.net.Proxy.getDefaultHost();
int proPort = android.net.Proxy.getDefaultPort();
if (proHost==null || proPort<0){
return false;
}else {
Log.i(httpConfig.getTagName(),"有代理,不能访问");
return true;
}
}
}
//更新字段值
public void updateCommonField(String key,String value){
httpConfig.updateCommonField(key,value);
}
public void removeCommonField(String key){
httpConfig.removeCommonField(key);
}
public void addCommonField(String key,String value){
httpConfig.addCommonField(key,value);
}
private <T> void sendCallback(RequestDataCallback<T> callback){
sendCallback(-1,null,null,callback);
}
private <T> void sendCallback(int status,T data,byte[] body,RequestDataCallback<T> callback){
CallbackMessage<T> msgData = new CallbackMessage<T>();
msgData.body = body;
msgData.status = status;
msgData.data = data;
msgData.callback = callback;
Message msg = handler.obtainMessage();
msg.obj = msgData;
handler.sendMessage(msg);
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
CallbackMessage data = (CallbackMessage)msg.obj;
data.callback();
}
};
private class CallbackMessage<T>{
public RequestDataCallback<T> callback;
public T data;
public byte[] body;
public int status;
public void callback(){
if(callback!=null){
if(data==null){
callback.dataCallback(null);
}else{
callback.dataCallback(status,data,body);
}
}
}
}
}
NameValuePair
package com.lianggao.whut.thirdtest.net;
public class NameValuePair {
private String name;//请求名称
private String value;//请求值
private boolean isFile=false;//是否是文件
public NameValuePair(String name, String value){
this.name=name;
this.value = value;
}
public NameValuePair(String name, String value,boolean isFile){
this.name=name;
this.value = value;
this.isFile=isFile;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isFile() {
return isFile;
}
public void setFile(boolean file) {
isFile = file;
}
}
RequestDataCallback
package com.lianggao.whut.thirdtest.net;
/**
* @author
* @ClassName: RequestDataCallback
* @Description: TODO(数据回传类)
* @date
*/
public abstract class RequestDataCallback<T> {
//返回json对象
public void dataCallback(T obj) {
}
//返回http状态和json对象
public void dataCallback(int status, T obj) {
dataCallback(obj);
}
//返回http状态、json对象和http原始数据
public void dataCallback(int status, T obj, byte[] body) {
dataCallback(status, obj);
}
}
MainActivity
package com.lianggao.whut.thirdtest;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.lianggao.whut.thirdtest.net.HttpCaller;
import com.lianggao.whut.thirdtest.net.NameValuePair;
import com.lianggao.whut.thirdtest.net.RequestDataCallback;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import io.github.lizhangqu.coreprogress.ProgressUIListener;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
import okio.Sink;
public class MainActivity8 extends Activity implements View.OnClickListener {
private static final String TAG = "MainActivity7";
private Button btn_login;
private EditText editText_name;
private EditText editText_age;
private ProgressBar progressBar;
private TextView tv_okhttp;
private OkHttpClient client = new OkHttpClient();
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private ProgressUIListener progressUIListener=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
findViewById(R.id.button_activity8).setOnClickListener(this);
findViewById(R.id.button_activity8_2).setOnClickListener(this);
findViewById(R.id.button_activity8_3).setOnClickListener(this);
findViewById(R.id.button_activity8_4).setOnClickListener(this);
findViewById(R.id.button_activity8_5).setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.button_activity8){
getSync();
//com.lianggao.whut.thirdtest.entity.User user=HttpCaller.getInstance().getSync(com.lianggao.whut.thirdtest.entity.User.class,"http://192.168.1.8:8080/com.lianggao.whut/Get_Resopnce_Servlet?username=lianggao&&password=12");
}
if(v.getId()==R.id.button_activity8_2){
postSync();
}
if(v.getId()==R.id.button_activity8_3){
//updaloadFile(progressUIListener);
//byte[] bytes=getUploadFileBytes();
//HttpCaller.getInstance().postFile(com.lianggao.whut.thirdtest.entity.User.class, "http://192.168.1.8:8080/com.lianggao.whut/ActionServlet", null, "upload_file","testByteUpload.txt",bytes,requestDataCallback);
updaloadFile(new ProgressUIListener(){
@Override
public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
Log.i("ansen","numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed);
}
});
}
if(v.getId()==R.id.button_activity8_4){
String saveFilePath=Environment.getExternalStorageDirectory() + "/testDownloadFile/lianggao.jpg";
Log.i("ansen",saveFilePath+"#################");//storage/0
HttpCaller.getInstance().downloadFile("http://192.168.1.4:8080/com.lianggao.whut/images/aa.jpg",saveFilePath,null,new ProgressUIListener(){
@Override
public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
Log.i("ansen","dowload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed);
}
});
}
if(v.getId()==R.id.button_activity8_5){
String saveFilePath=Environment.getExternalStorageDirectory() + "/testDownloadFile/lianggao.txt";
HttpCaller.getInstance().downloadFile("http://192.168.1.4:8080/com.lianggao.whut/txtbooks/ansen.txt",saveFilePath,null,new ProgressUIListener(){
@Override
public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
Log.i("ansen","dowload file content numBytes:"+numBytes+" totalBytes:"+totalBytes+" percent:"+percent+" speed:"+speed);
}
});
}
}
//在Android中UI线程是不能访问网络的,如果是同步请求网络,需要放在子线程中
private void getSync(){
new Thread(){
@Override
public void run() {
Looper.prepare();
com.lianggao.whut.thirdtest.entity.User user=HttpCaller.getInstance().getSync(com.lianggao.whut.thirdtest.entity.User.class,"http://192.168.1.4:8080/com.lianggao.whut/Get_Resopnce_Servlet?username=lianggao&password=12&action=yes");
Log.i("ansen","get sync 用户name:"+user.getUsername());
Looper.loop();
}
}.start();
}
private void postSync(){
new Thread(){
@Override
public void run() {
Looper.prepare();
List<NameValuePair> postParam = new ArrayList<>();
postParam.add(new NameValuePair("username","lianggao"));
postParam.add(new NameValuePair("password","12"));
postParam.add(new NameValuePair("action","postAction"));
com.lianggao.whut.thirdtest.entity.User user=HttpCaller.getInstance().postSync(com.lianggao.whut.thirdtest.entity.User.class,"http://192.168.1.4:8080/com.lianggao.whut/Get_Resopnce_Servlet",postParam);
Log.i("ansen","post sync 用户name:"+user.getUsername());
Looper.loop();
}
}.start();
}
private void updaloadFile(ProgressUIListener progressUIListener){
List<NameValuePair> postParam = new ArrayList<>();
postParam.add(new NameValuePair("username", "ansen"));
postParam.add(new NameValuePair("password", "123"));
String filePath=copyFile();//复制一份文件到sdcard上,并且获取文件路径
postParam.add(new NameValuePair("upload_file",filePath,true));
HttpCaller.getInstance().postFile(com.lianggao.whut.thirdtest.entity.User.class, "http://192.168.1.4:8080/com.lianggao.whut/ActionServlet", null, postParam, requestDataCallback);
}
private RequestDataCallback requestDataCallback = new RequestDataCallback<com.lianggao.whut.thirdtest.entity.User>() {
@Override
public void dataCallback(com.lianggao.whut.thirdtest.entity.User user) {
if(user==null){
Log.i("ansen", "请求失败");
}else{
Log.i("ansen", "获取用户信息:" + user.toString());
}
}
};
/**
* 如果sd卡存在这个文件就先删除
* 然后再从assets下把test.txt复制到sd卡上
* @return
*/
private String copyFile() {
AssetManager assetManager = this.getAssets();
System.out.println(Environment.getExternalStorageDirectory());
//String newFilePath=Environment.getExternalStorageDirectory() + "/test/test.txt";
String newFilePath = "/storage/emulated/0/testCopyFile/sun.jpg";
File file = new File(newFilePath);
if(file.exists()){
file.delete();
}
try {
InputStream in = assetManager.open("sun.jpg");
OutputStream out = new FileOutputStream(newFilePath);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
out.flush();
out.close();
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
return newFilePath;
}
private byte[] getUploadFileBytes(){
byte[] bytes=null;
try {
InputStream inputStream = getAssets().open("testByteUpload.txt");
Log.i("ansen","文件长度:"+inputStream.available());
bytes = new byte[inputStream.available()];
inputStream.read(bytes);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
}
实现json传递中文和本地选择pdf和txt文件,实现pdf阅读
解决textview设置图片不清晰的问题
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.