Fresco展示图片缓存,Retrofit+OKHttp请求数据,greenDao数据库展示数据

在app的build.gradle依赖

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'
    implementation('com.jcodecraeer:xrecyclerview:1.5.9') {
        exclude group: 'com.android.support'
    }
    implementation 'com.github.bumptech.glide:glide:3.8.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'

访问http://www.zhaoapi.cn/product/searchProducts?keywords=手机&sort=1

Bean类

Goods类

@Entity
public class Goods {
    private double bargainPrice;
    private String createtime;
    private String detailUrl;
    private String images;
    private int num;
    private int pid;
    private double price;
    private int pscid;
    private int selected;
    @Id(autoincrement = true)
    private long sellerid;
    private String subhead;
    private String title;
    private int count=1;

Result类

public class Result<T> {
    private String code;
    private String msg;
    private T data;

core包里写

BaseCore

public interface BaseCore<T> {
    void loadSuccess(T data);
    void loadError(Result result);
}

DataCall


public interface DataCall {
    @POST("product/searchProducts")
    @FormUrlEncoded
    Observable<Result<List<Goods>>> loginRx(@Field("keywords")String keywords,
                                           @Field("sort")String sort);
}

app包里写

Myapp,清单文件上配置

package com.baidu.lianxi4.app;

import android.app.Application;
import android.os.Environment;

import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;

import java.io.File;


public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this,getConfig());
    }

    private ImagePipelineConfig getConfig() {
        File file = new File(Environment.getExternalStorageDirectory()+File.separator+"image");
        if (!file.exists()){
            file.mkdir();
        }
        ImagePipelineConfig config =  ImagePipelineConfig.newBuilder(this)
                .setMainDiskCacheConfig(DiskCacheConfig.newBuilder(this)
                        .setBaseDirectoryPath(file)
                        .build()).build();
                return config;

    }
}

http包里写

NetWorkManager

package com.baidu.lianxi4.http;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Zaifeng on 2018/2/28.
 * API初始化类
 */
public class NetWorkManager {

    private static NetWorkManager mInstance;
    private Retrofit retrofit;
    private static final String BASE_URL="http://www.zhaoapi.cn/";


    private NetWorkManager(){
        init();
    }

    public static NetWorkManager getInstance(){
        if (mInstance==null){
            mInstance = new NetWorkManager();
        }
        return mInstance;
    }

    /**
     * 初始化必要对象和参数
     */
    public void init() {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .build();




        // 初始化Retrofit
        retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    //把接口的注解翻译为OKhttp请求
    public <T> T create(final Class<T> service) {
        return retrofit.create(service);
    }
    public boolean isNet(Context context){
        ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info!=null&&info.isConnected()){
            return true;
        }else {
            return false;
        }
    }

}

把Greendao的依赖补全

app级别

implementation 'org.greenrobot:greendao:3.2.2'
    implementation 'org.greenrobot:greendao-generator:3.2.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    /*加载图片的框架Fresco*/
    implementation 'com.facebook.fresco:fresco:1.11.0'

最上面

apply plugin: 'org.greenrobot.greendao'

模块

greendao {
    schemaVersion 1  //版本
    daoPackage 'com.baidu.lianxi4.greendao' // 一般为app包名+生成文件的文件夹名
    targetGenDir 'src/main/java' //生成文件路径
}

程序级别

  classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

保证bean类正确

自动greendao

persenter包里写GoodsPresnter

package com.baidu.lianxi4.persenter;



import android.widget.Toast;

import com.baidu.lianxi4.DataCall;
import com.baidu.lianxi4.bean.Goods;
import com.baidu.lianxi4.bean.Result;
import com.baidu.lianxi4.core.BaseCore;
import com.baidu.lianxi4.http.NetWorkManager;
import com.google.gson.Gson;

import java.util.List;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

public class GoodsPresenter {

    private BaseCore baseCore;

    public GoodsPresenter(BaseCore baseCore) {
        this.baseCore=baseCore;
    }
    public void unBaseCore(){
        baseCore = null;
    }
    public void readData(Object... objects){
        String keywords= (String) objects[0];
        DataCall iLogin = NetWorkManager.getInstance().create(DataCall.class);
        iLogin.loginRx("手机","1")
                .subscribeOn(Schedulers.newThread())//将请求调度到子线程上
                .observeOn(AndroidSchedulers.mainThread())//观察响应结果,把响应结果调度到主线程中处理
                .subscribe(new Consumer<Result<List<Goods>>>() {//把响应结果订阅到消费者中进行处理
                    @Override
                    public void accept(Result<List<Goods>> result) throws Exception {
                        if (result.getCode().equals("0")){
                            baseCore.loadSuccess(result.getData());
                        }else {
                            baseCore.loadError(result);
                        }
                    }
                });
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></android.support.v7.widget.RecyclerView>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:layout_height="wrap_content">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image_view"
        android:layout_width="100dp"
        android:layout_height="100dp"

        android:adjustViewBounds="true"/>
    <TextView
        android:id="@+id/text_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"
        android:text="标题"/>
    <TextView
        android:id="@+id/text_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#f00"
        android:textSize="20sp"
        android:text="价格"/>
</LinearLayout>

MainActicity

package com.baidu.lianxi4;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.lianxi4.adapter.MyAdapter;
import com.baidu.lianxi4.bean.Goods;
import com.baidu.lianxi4.bean.Result;
import com.baidu.lianxi4.core.BaseCore;
import com.baidu.lianxi4.greendao.DaoMaster;
import com.baidu.lianxi4.greendao.DaoSession;
import com.baidu.lianxi4.greendao.GoodsDao;
import com.baidu.lianxi4.http.NetWorkManager;
import com.baidu.lianxi4.persenter.GoodsPresenter;
import com.google.gson.Gson;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;


public class MainActivity extends AppCompatActivity implements BaseCore {



    @BindView(R.id.recycler)
    RecyclerView recycler;
    private GoodsPresenter presenter;
    private GoodsDao goodsBeanDao;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
       // StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
       // recycler.setLayoutManager(staggeredGridLayoutManager);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(OrientationHelper.VERTICAL);
        recycler.setLayoutManager(layoutManager);
        presenter = new GoodsPresenter(this);

        DaoSession daoSession = DaoMaster.newDevSession(this, GoodsDao.TABLENAME);
        goodsBeanDao = daoSession.getGoodsDao();
        boolean net = NetWorkManager.getInstance().isNet(this);
        if (net) {
            presenter.readData("笔记本");
        } else {
            List<Goods> list = goodsBeanDao.loadAll();
            MyAdapter adapter = new MyAdapter();
            adapter.setContext(this);
            adapter.setList(list);
            recycler.setAdapter(adapter);
        }

    }


    @Override
    public void loadSuccess(Object data) {
        List<Goods> list = (List<Goods>) data;
        goodsBeanDao.insertOrReplaceInTx(list);
        MyAdapter adapter = new MyAdapter();
        adapter.setContext(this);
        adapter.setList(list);
        recycler.setAdapter(adapter);
    }

    @Override
    public void loadError(Result result) {
        Toast.makeText(this, result.getMsg(), Toast.LENGTH_SHORT).show();
    }

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

适配器

package com.baidu.lianxi4.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import android.widget.LinearLayout;
import android.widget.TextView;

import com.baidu.lianxi4.R;
import com.baidu.lianxi4.bean.Goods;

import com.facebook.drawee.view.SimpleDraweeView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> {
    private Context context;
    private List<Goods> list;

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public List<Goods> getList() {
        return list;
    }

    public void setList(List<Goods> list) {
        this.list = list;
    }

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LinearLayout.inflate(viewGroup.getContext(), R.layout.itme_layout, null);
        return new VH(v);
    }

    @Override
    public void onBindViewHolder(@NonNull VH vh, int i) {
        vh.title.setText(list.get(i).getTitle());
        vh.price.setText("¥"+list.get(i).getPrice());
        String replace = list.get(i).getImages();//.replace("https", "http");
        String[] split = replace.split("!");
        vh.imageView.setImageURI(split[0]);
    }

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

    public class VH extends RecyclerView.ViewHolder{
        private final SimpleDraweeView imageView;
        private final TextView title;
        private final TextView price;
        public VH(@NonNull View itemView) {
            super(itemView);
            imageView= itemView.findViewById(R.id.image_view);
            title= itemView.findViewById(R.id.text_title);
            price= itemView.findViewById(R.id.text_price);
        }
    }
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值