OKHttp+MVP框架

首先导入依赖

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'

App类

package com.bwie.chuliangliang.demo20180811_demo1.data;

import android.app.Application;
import android.graphics.Bitmap;
import android.os.Handler;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.utils.StorageUtils;

import java.io.File;

public class App extends Application {

    private static App app;

    @Override
    public void onCreate() {
        super.onCreate();
        app = this;
        initImageLouder();
    }
    public static App getInstance(){
        return app;
    }

    private void initImageLouder() {
        File cacheDir = StorageUtils.getCacheDirectory(app);  //缓存文件夹路径
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(app)
                .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 内存缓存文件的最大长宽
                .diskCacheExtraOptions(480, 800, null)  // 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
                .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
                .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值
                .memoryCacheSizePercentage(13) // default
                .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
                .diskCacheFileCount(100)  // 可以缓存的文件数量
                // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .writeDebugLogs() // 打印debug log
                .build(); //开始构建
        ImageLoader.getInstance().init(config);
    }
    public static DisplayImageOptions getOptions(){
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(false)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型
                //.displayer(new RoundedBitmapDisplayer(300)) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)
                .handler(new Handler()) // default
                .build();
        return options;
    }


}

基类

package com.bwie.chuliangliang.demo20180811_demo1.di;

public interface IContract {
    public interface IView{
        void showData(String responseMsg);
        void showDatas(String responseMsg);
    }
    public interface IPresenter<IView>{
        void attachView(IView iView);
        void detachView(IView iView);
        void requestInfo(String username, String password);
        void requestInfos(String username, String password);
        void requestInfoes(String names);
    }
    public interface IModel{
        interface onCallBack{
            void responseMsg(String responseMsg);
        }
        void requestMsg(String username, String password, onCallBack onCallBack);
        void requestMsgs(String username, String password, onCallBack onCallBack);
        void requestMsgshow(String names, onCallBack onCallBack);
    }
}

Model层

package com.bwie.chuliangliang.demo20180811_demo1.di.model;

import com.bwie.chuliangliang.demo20180811_demo1.data.OKHttpUtils;
import com.bwie.chuliangliang.demo20180811_demo1.di.IContract;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Response;

public class ModelImpl implements IContract.IModel {
    private static final String POST_UTILS = "https://www.zhaoapi.cn/user/reg";
    private static final String POST_UTILSS = "https://www.zhaoapi.cn/user/login";
    private static final String POST_UTILSSHOW = "https://www.zhaoapi.cn/product/searchProducts";
    @Override
    public void requestMsg(String username, String password, final onCallBack onCallBack) {
        if (username.equals("")||password.equals("")){
            onCallBack.responseMsg("用户名或密码不能为空");
            return;
        }
        FormBody formBody = new FormBody.Builder()
                .add("mobile",username)
                .add("password",password)
                .build();
        OKHttpUtils.getInstance().post(POST_UTILS, formBody, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                String errorMag = e.getMessage().toString();
                onCallBack.responseMsg(errorMag);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseMsg = response.body().string();
                onCallBack.responseMsg(responseMsg);
            }
        });
    }

    @Override
    public void requestMsgs(String username, String password, final onCallBack onCallBack) {
        FormBody formBody = new FormBody.Builder()
                .add("mobile",username)
                .add("password",password)
                .build();
        OKHttpUtils.getInstance().post(POST_UTILSS, formBody, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                String errorMsg = e.getMessage().toString();
                onCallBack.responseMsg(errorMsg);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseMsg = response.body().string();
                onCallBack.responseMsg(responseMsg);
            }
        });
    }

    @Override
    public void requestMsgshow(String names, final onCallBack onCallBack) {
        FormBody formBody = new FormBody.Builder()
                .add("keywords",names)
                .add("page","1")
                .build();
        OKHttpUtils.getInstance().post(POST_UTILSSHOW, formBody, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseMsg = response.body().string();
                onCallBack.responseMsg(responseMsg);
            }
        });
    }
}

Presenter层

package com.bwie.chuliangliang.demo20180811_demo1.di.presenter;

import com.bwie.chuliangliang.demo20180811_demo1.di.IContract;
import com.bwie.chuliangliang.demo20180811_demo1.di.model.ModelImpl;

import java.lang.ref.WeakReference;

public class PresenterImpl implements IContract.IPresenter<IContract.IView> {
    IContract.IView iView;
    private IContract.IModel model;
    private WeakReference<IContract.IView> iViewWeakReference;
    private WeakReference<IContract.IModel> iModelWeakReference;

    @Override
    public void attachView(IContract.IView iView) {
        this.iView = iView;
        model = new ModelImpl();
        iViewWeakReference = new WeakReference<>(iView);
        iModelWeakReference = new WeakReference<>(model);
    }

    @Override
    public void detachView(IContract.IView iView) {
        iViewWeakReference.clear();
        iModelWeakReference.clear();
    }

    @Override
    public void requestInfo(String username, String password) {
        model.requestMsg(username,password,new IContract.IModel.onCallBack() {
            @Override
            public void responseMsg(String responseMsg) {
                iView.showData(responseMsg);
            }
        });

    }

    @Override
    public void requestInfos(String username, String password) {
        model.requestMsgs(username, password, new IContract.IModel.onCallBack() {
            @Override
            public void responseMsg(String responseMsg) {
                iView.showData(responseMsg);
            }
        });
    }

    @Override
    public void requestInfoes(String names) {
        model.requestMsgshow(names, new IContract.IModel.onCallBack() {
            @Override
            public void responseMsg(String responseMsg) {
                iView.showDatas(responseMsg);
            }
        });
    }

}

网络请求OKHttp

package com.bwie.chuliangliang.demo20180811_demo1.data;

import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;

public class OKHttpUtils {
    public static OKHttpUtils instance;
    public OkHttpClient okHttpClient;
    public OKHttpUtils(){
        if (null == instance){
            synchronized (OkHttpClient.class){
                if (null == instance){
                    okHttpClient = new OkHttpClient.Builder().build();
                }
            }
        }
    }
    public static OKHttpUtils getInstance(){
        if (null == instance){
            synchronized (OKHttpUtils.class){
                if (null == instance){
                    instance = new OKHttpUtils();
                }
            }
        }
        return instance;
    }
    public void get(String urlString, Callback callback){
        Request request = new Request.Builder().url(urlString).build();
        okHttpClient.newCall(request).enqueue(callback);
    }
    public void post(String urlString, FormBody formBody,Callback callback){
        Request request = new Request.Builder().method("POST",formBody).url(urlString).build();
        okHttpClient.newCall(request).enqueue(callback);
    }
}

登录页面

package com.bwie.chuliangliang.demo20180811_demo1.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.bwie.chuliangliang.demo20180811_demo1.di.IContract;
import com.bwie.chuliangliang.demo20180811_demo1.di.presenter.PresenterImpl;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity implements IContract.IView {

    @BindView(R.id.edit_username)
    EditText editUsername;
    @BindView(R.id.edit_password)
    EditText editPassword;
    @BindView(R.id.but_config)
    Button butConfig;
    private IContract.IPresenter<IContract.IView> presenter;
    private String username;
    private String password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        presenter = new PresenterImpl();
        presenter.attachView(this);
    }

    @Override
    public void showData(final String responseMsg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (username.equals("")||password.equals("")){
                    Toast.makeText(MainActivity.this, "用户或密码不能为空", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this, responseMsg, Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(MainActivity.this,WelloActivity.class));
                }
            }
        });

    }
    @Override
    public void showDatas(final String responseMsg) {

    }

    @OnClick(R.id.but_config)
    public void onViewClicked() {
        username = editUsername.getText().toString();
        password = editPassword.getText().toString();
        presenter.requestInfo(username, password);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView(this);
    }
}

注册页面

package com.bwie.chuliangliang.demo20180811_demo1.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.bwie.chuliangliang.demo20180811_demo1.di.IContract;
import com.bwie.chuliangliang.demo20180811_demo1.di.presenter.PresenterImpl;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class WelloActivity extends AppCompatActivity implements IContract.IView {

    @BindView(R.id.edit_name)
    EditText editName;
    @BindView(R.id.edit_pass)
    EditText editPass;
    @BindView(R.id.but_configs)
    Button butConfigs;
    private IContract.IPresenter<IContract.IView> presenter;
    private String name;
    private String pass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wello);
        ButterKnife.bind(this);
        presenter = new PresenterImpl();
        presenter.attachView(this);
    }

    @Override
    public void showData(final String responseMsg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (name.equals("")||pass.equals("")){
                    Toast.makeText(WelloActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(WelloActivity.this, responseMsg, Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(WelloActivity.this,ShowActivity.class));
                }
            }
        });
    }
    @Override
    public void showDatas(final String responseMsg) {

    }

    @OnClick(R.id.but_configs)
    public void onViewClicked() {
        name = editName.getText().toString();
        pass = editPass.getText().toString();
        presenter.requestInfos(name, pass);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView(this);
    }
}

数据展示页面

package com.bwie.chuliangliang.demo20180811_demo1.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.bwie.chuliangliang.demo20180811_demo1.data.bean.UserBean;
import com.bwie.chuliangliang.demo20180811_demo1.data.mybase.MyBase;
import com.bwie.chuliangliang.demo20180811_demo1.di.IContract;
import com.bwie.chuliangliang.demo20180811_demo1.di.presenter.PresenterImpl;
import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class ShowActivity extends AppCompatActivity implements IContract.IView{

    @BindView(R.id.text_fan)
    TextView textFan;
    @BindView(R.id.edit_names)
    EditText editNames;
    @BindView(R.id.but_cha)
    Button butCha;
    @BindView(R.id.listview)
    ListView listview;
    private IContract.IPresenter presenter;
    private MyBase myBase;
    private List<UserBean.DataBean> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        ButterKnife.bind(this);
        presenter = new PresenterImpl();
        presenter.attachView(this);

    }

    @OnClick(R.id.but_cha)
    public void onViewClicked() {
        String names = editNames.getText().toString();
        presenter.requestInfoes(names);
    }

    @Override
    public void showData(String responseMsg) {

    }

    @Override
    public void showDatas(final String responseMsg) {

        Gson gson = new Gson();
        UserBean userBean = gson.fromJson(responseMsg, UserBean.class);
        List<UserBean.DataBean> data = userBean.getData();
        myBase = new MyBase(this, data);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(ShowActivity.this, responseMsg+"", Toast.LENGTH_SHORT).show();
                listview.setAdapter(myBase);
            }
        });
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                startActivity(new Intent(ShowActivity.this,CodeActivity.class));
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView(this);
    }
}
适配器类
package com.bwie.chuliangliang.demo20180811_demo1.data.mybase;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.bwie.chuliangliang.demo20180811_demo1.data.App;
import com.bwie.chuliangliang.demo20180811_demo1.data.bean.UserBean;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.List;

public class MyBase extends BaseAdapter {
    private Context context;
    private List<UserBean.DataBean> list;
    private String s;

    public MyBase(Context context, List<UserBean.DataBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        String images = list.get(i).getImages();
        String[] split = images.split("\\|");
        for (int j = 0; j < split.length ; j++) {
            s = split[0];
        }
        ViewHolder holder;
        if (view == null){
            view = View.inflate(context, R.layout.mybase,null);
            holder = new ViewHolder();
            holder.name = view.findViewById(R.id.text_name);
            holder.names = view.findViewById(R.id.text_names);
            holder.image = view.findViewById(R.id.imageView);
            view.setTag(holder);
        }else {
            holder = (ViewHolder) view.getTag();
        }
        holder.name.setText(list.get(i).getTitle());
        holder.names.setText(list.get(i).getPrice()+"");
        ImageLoader.getInstance().displayImage(s,holder.image, App.getOptions());
        return view;
    }
    class ViewHolder{
        TextView name,names;
        ImageView image;
    }
}

二维码页面

package com.bwie.chuliangliang.demo20180811_demo1.ui.activity;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.bwie.chuliangliang.demo20180811_demo1.R;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class CodeActivity extends AppCompatActivity {

    @BindView(R.id.btn_scan)
    Button btnScan;
    @BindView(R.id.btn_generate)
    Button btnGenerate;
    @BindView(R.id.et_QRCode)
    EditText etQRCode;
    @BindView(R.id.iv_showQRCode)
    ImageView ivShowQRCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_code);
        ButterKnife.bind(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (result != null) {
            if (result.getContents() == null) {
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
    @OnClick({R.id.btn_scan, R.id.btn_generate})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_scan:
                IntentIntegrator integrator = new IntentIntegrator(this);
                integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
                integrator.setPrompt("Scan a barcode");
                integrator.setCameraId(0);  // Use a specific camera of the device
                integrator.setBeepEnabled(false);
                integrator.setBarcodeImageEnabled(true);
                integrator.initiateScan();
                break;
            case R.id.btn_generate:
                try {
                    String responseString = etQRCode.getText().toString();
                    BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
                    Bitmap bitmap = barcodeEncoder.encodeBitmap(responseString, BarcodeFormat.QR_CODE, 400, 400);
                    ivShowQRCode.setImageBitmap(bitmap);
                } catch (Exception e) {

                }
                break;
        }
    }
}

二维码页面

implementation 'com.journeyapps:zxing-android-embedded:3.6.0'依赖
<application
android:hardwareAccelerated="true"

猜你喜欢

转载自blog.csdn.net/chy521xin/article/details/81588057
今日推荐