首先导入依赖
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"