Git Product home page Git Product logo

androidebook's People

Watchers

 avatar

androidebook's Issues

修改书架

书架改为在本地数据库中进行存储,
数据库应该包括
1.书的编号,书的名称,书的作者,书的封面路径,书的文件路径
2.书的封面和文件路径放在本地文件夹里面

显示推荐图书1

1.在eclipse中设置文件夹,放入待显示的图片
image
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;
            }
        }
    };

将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中

封装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;
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.