1. 程式人生 > >OkHttp二次封裝請求 攔截器

OkHttp二次封裝請求 攔截器

1. 專案框架:必須使用MVP

2. 圖片載入: Universal-Image-LoaderGlide圖片載入框架

3.網路載入框架:OkHttp,二次封裝,採用單例模式,自定義應用攔截器,封裝公共請求引數(注意:必須通過攔截器封裝公共請求引數,否則無法請求資料,判0分)

公共請求引數:source=android

引數名稱:source

引數值:android

型別:String

是否必傳:是

5. 資料展示使用RecylerView或者XRecyclerView,可以進行下拉重新整理和上拉載入更多,下拉重新整理的時候請求第一頁資料,上拉載入的時候page+1請求更多資料進行展示

6.靈活使用recyclerView的佈局管理器,點選右上角圖示的時候,圖示切換並且展示資料的形式跟隨改變,連續再次點選也必須能夠改變顯示

.需求

1.圖一是搜尋頁面,實現如圖類似佈局,中間自定義流式佈局,下面是搜尋歷史,點選搜尋後的關鍵詞進行儲存,並可以清空歷史,,,點選搜尋跳轉到商品列表頁面

2.圖二和圖三是搜尋到商品的列表頁面,必須實現下拉重新整理和上拉載入更多,自己確定使用什麼重新整理控制元件!點選右上角的圖示,使用佈局管理器進行列表和表格效果的切換

3.recyclerView的條目新增點選事件,進入圖四詳情頁面,詳情頁面展示輪播圖,標題,價錢,加入購物車,,,點選加入購物車請求購物車介面

,吐司加入成功/失敗

五、介面:

keywords=筆記本&page=1

引數說明:

keywords 關鍵字欄位 String型別 必傳

page  頁碼數  String型別  必傳

商品詳情:

引數pid

新增購物車:

引數:uid,pid…………uid可以固定傳入

公共引數:source 來源欄位 String型別 (通過自定義攔截器封裝,否則判0分)

來首先我們先新增依賴

compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12' compile 'com.google.code.gson:gson:2.8.2' compile 'com.xhb:xbanner:1.2.2' compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.nineoldandroids:library:2.4.0' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile project(':library')這個是PullToRefreshScrollView的依賴

API類
public class API {
    /*
    *https://www.zhaoapi.cn/product/searchProducts?keywords=筆記本&page=1&source=android
     */
public  static final String serchpath="https://www.zhaoapi.cn/product/searchProducts";
}

app 類
package com.example.hongliang1510c20171216;

import android.app.Application;




public class app extends Application {

    @Override
public void onCreate() {
        super.onCreate();
        ImageloaderUtil.init(this);

    }
}

Bean 包
package com.example.hongliang1510c20171216;


public class Bean {



    private String msg;
    private String code;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

ImageloaderUtil

package com.example.hongliang1510c20171216;

import android.content.Context;
import android.graphics.Bitmap;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
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.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;

import java.io.File;

/**
 * Created by ML on 2017/12/5.
 */
public class ImageloaderUtil {
    public static void  init(Context context){
        File cacheDir = StorageUtils.getCacheDirectory(context);  //快取資料夾路徑
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPoolSize(3) // default  執行緒池內載入的數量
.threadPriority(Thread.NORM_PRIORITY - 2) // default 設定當前執行緒的優先順序
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通過自己的記憶體快取實現
.memoryCacheSize(2 * 1024 * 1024)  // 記憶體快取的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定義快取路徑
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)快取的最大值
.diskCacheFileCount(100)  // 可以快取的檔案數量
                // default為使用HASHCODE對UIL進行加密命名, 還可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
                .imageDownloader(new BaseImageDownloader(context)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 列印debug log
.build(); //開始構建
ImageLoader.getInstance().init(config);
    }
    public  static DisplayImageOptions getDefultOption(){
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.mipmap.ic_launcher) // 設定圖片下載期間顯示的圖片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 設定圖片Uri為空或是錯誤的時候顯示的圖片
.showImageOnFail(R.mipmap.ic_launcher) // 設定圖片載入或解碼過程中發生錯誤顯示的圖片
.resetViewBeforeLoading(true)  // default 設定圖片在載入前是否重置、復位
.delayBeforeLoading(1000)  // 下載前的延遲時間
.cacheInMemory(true) // default  設定下載的圖片是否快取在記憶體中
.cacheOnDisk(true) // default  設定下載的圖片是否快取在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 設定圖片以如何的編碼方式顯示
.bitmapConfig(Bitmap.Config.ARGB_8888) // default 設定圖片的解碼型別
.displayer(new RoundedBitmapDisplayer(10)) // default  還可以設定圓角圖片new RoundedBitmapDisplayer(20)
.build();
        return options;
    }
}

Liulayout
package com.example.hongliang1510c20171216;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

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


public class Liulayout extends ViewGroup {
    private List<List<View>> mAllChildViews = new ArrayList<>();
    //每一行的高度
private List<Integer> mLineHeight = new ArrayList<>();

    public Liulayout(Context context) {
        this(context, null);
        // TODO Auto-generated constructor stub
}
    public Liulayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        // TODO Auto-generated constructor stub
}
    public Liulayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
}
    @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
//父控制元件傳進來的寬度和高度以及對應的測量模式
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
        int modeHeight = MeasureSpec.getMode(heightMeasureSpec);

        //如果當前ViewGroup的寬高為wrap_content的情況
int width = 0;//自己測量的 寬度
int height = 0;//自己測量的高度
        //記錄每一行的寬度和高度
int lineWidth = 0;
        int lineHeight = 0;

        //獲取子view的個數
int childCount = getChildCount();
        for(int i = 0;i < childCount; i ++){
            View child = getChildAt(i);
            //測量子View的寬和高
measureChild(child, widthMeasureSpec, heightMeasureSpec);
            //得到LayoutParams
MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
            //子View佔據的寬度
int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            //子View佔據的高度
int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
            //換行時候
if(lineWidth + childWidth > sizeWidth){
                //對比得到最大的寬度
width = Math.max(width, lineWidth);
                //重置lineWidth
lineWidth = childWidth;
                //記錄行高
height += lineHeight;
                lineHeight = childHeight;
            }else{//不換行情況
                //疊加行寬
lineWidth += childWidth;
                //得到最大行高
lineHeight = Math.max(lineHeight, childHeight);
            }
            //處理最後一個子View的情況
if(i == childCount -1){
                width = Math.max(width, lineWidth);
                height += lineHeight;
            }
        }
        //wrap_content
setMeasuredDimension(modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width,
                modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
mAllChildViews.clear();
        mLineHeight.clear();
        //獲取當前ViewGroup的寬度
int width = getWidth();

        int lineWidth = 0;
        int lineHeight = 0;
        //記錄當前行的view
List<View> lineViews = new ArrayList<View>();
        int childCount = getChildCount();
        for(int i = 0;i < childCount; i ++){
            View child = getChildAt(i);
            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
            int childWidth = child.getMeasuredWidth();
            int childHeight = child.getMeasuredHeight();

            //如果需要換行
if(childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width){
                //記錄LineHeight
mLineHeight.add(lineHeight);
                //記錄當前行的Views
mAllChildViews.add(lineViews);
                //重置行的寬高
lineWidth = 0;
                lineHeight = childHeight + lp.topMargin + lp.bottomMargin;
                //重置view的集合
lineViews = new ArrayList();
            }
            lineWidth += childWidth + lp.leftMargin + lp.rightMargin;
            lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin);
            lineViews.add(child);
        }
        //處理最後一行
mLineHeight.add(lineHeight);
        mAllChildViews.add(lineViews);

        //設定子View的位置
int left = 0;
        int top = 0;
        //獲取行數
int lineCount = mAllChildViews.size();
        for(int i = 0; i < lineCount; i ++){
            //當前行的views和高度
lineViews = mAllChildViews.get(i);
            lineHeight = mLineHeight.get(i);
            for(int j = 0; j < lineViews.size(); j ++){
                View child = lineViews.get(j);
                //判斷是否顯示
if(child.getVisibility() == View.GONE){
                    continue;
                }
                MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
                int cLeft = left + lp.leftMargin;
                int cTop = top + lp.topMargin;
                int cRight = cLeft + child.getMeasuredWidth();
                int cBottom = cTop + child.getMeasuredHeight();
                //進行子View進行佈局
child.layout(cLeft, cTop, cRight, cBottom);
                left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;
            }
            left = 0;
            top += lineHeight;
        }

    }
    /**
     * 與當前ViewGroup對應的LayoutParams
     */
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
        // TODO Auto-generated method stub
return new MarginLayoutParams(getContext(), attrs);
    }
}

MainActivity
package com.example.hongliang1510c20171216;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    private String mNames[] = {
            "棉褲","大棉襖","大羽絨服",
            "小羽絨服","北極星掛鐘","加溼器",
            "風信子種球","仙人球防輻射","微波爐"
};
    private Liulayout liu_layout;
    private EditText edit_text;
    private ListView listView;
    private List<String> list = new ArrayList<>();
    private SQLiteDatabase db;
    private ArrayAdapter<String> stringArrayAdapter;
    private LinearLayout linear;
    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (getSupportActionBar()!=null){
            getSupportActionBar().hide();
        }
        initChildViews();
        edit_text = (EditText) findViewById(R.id.edit_text);
        listView = (ListView) findViewById(R.id.lv);
        linear = (LinearLayout) findViewById(R.id.linear);
        linear.setVisibility(View.INVISIBLE);
        db = openOrCreateDatabase("db", MODE_PRIVATE, null);
        db.execSQL("create table if not exists user(id integer primary key,name varchar(20))");
        Cursor cursor = db.rawQuery("select * from user", null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            list.add(name);
        }
        if (list.size()>0){
            stringArrayAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, list);
            listView.setAdapter(stringArrayAdapter);
            listView.setOnItemClickListener(this);
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    list.remove(position);
                    stringArrayAdapter.notifyDataSetChanged();
                    return false;
                }
            });
            linear.setVisibility(View.VISIBLE);
        }
    }
    private void initChildViews() {
        // TODO Auto-generated method stub
liu_layout = (Liulayout) findViewById(R.id.liu_layout);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT
,RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = 5;
        lp.rightMargin = 5;
        lp.topMargin = 5;
        lp.bottomMargin = 5;
        for(int i = 0; i < mNames.length; i ++){
            TextView view = new TextView(this);
            view.setText(mNames[i]);
            view.setTextColor(Color.BLACK);
            view.setBackgroundDrawable(getResources().getDrawable(R.drawable.textview_bg));
            liu_layout.addView(view,lp);
        }
    }

    @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String s = list.get(position);
        if (s !=null){
            Intent intent = new Intent(MainActivity.this,SearchActivity.class);
            intent.putExtra("str", s);
            startActivity(intent);
        }

    }

    public void search(View view) {
        String s = edit_text.getText().toString();
        if (s !=null){
            Intent intent = new Intent(MainActivity.this,SearchActivity.class);
            intent.putExtra("str", s);
            startActivity(intent);
            db.execSQL("insert into user(name)values(?)",new String[]{s});
            list.add(s);
            stringArrayAdapter.notifyDataSetChanged();
        }


    }

}


MyOnItemClickListener 自定義介面
package com.example.hongliang1510c20171216;

import android.view.View;


public interface MyOnItemClickListener {
    void OnItemClickListener(View view, int position);
}

OkHttp二次封裝

package com.example.hongliang1510c20171216;

import android.os.Environment;

import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

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



public class Okhttputils {
    public static OkHttpClient okHttpClient=null;


    public static OkHttpClient getInstance() {
        if (okHttpClient == null) {
            synchronized (Okhttputils.class) {
                if (okHttpClient == null) {
                    File sdcache = new File(Environment.getExternalStorageDirectory(), "regist");
                    int cacheSize = 10 * 1024 * 1024;
                    okHttpClient = new OkHttpClient.Builder()
                            .connectTimeout(15, TimeUnit.SECONDS)
                            .writeTimeout(20, TimeUnit.SECONDS)
                            .readTimeout(20, TimeUnit.SECONDS)
                            .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))
                            .build();
                }
            }

        }

        return okHttpClient;
    }
    public static void doGet(String url, Callback callback) {
        OkHttpClient okHttpClient = getInstance();
        Request request = new Request.Builder().url(url).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);


    }
    public static void doPost(String url, Map<String, String> params, Callback callback) {
        OkHttpClient okHttpClient = getInstance();
        FormBody.Builder builder = new FormBody.Builder();
        for (String key : params.keySet()) {
            builder.add(key, params.get(key));

        }
        Request request = new Request.Builder().url(url).post(builder.build()).build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);

    }

}

OnItemClickListner 介面

package com.example.hongliang1510c20171216;

import android.view.View;


public interface OnItemClickListner {
    public void onItemClick(int position);
}

Search_adapter 介面卡
package com.example.hongliang1510c20171216;

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.List;


public class Search_adapter extends RecyclerView.Adapter<Searchholder> {
    Context context;
    List<SerchBean.DataBean> data;
    private MyOnItemClickListener itemClickListener;

    public Search_adapter(Context context, List<SerchBean.DataBean> data) {
        this.context = context;
        this.data = data;
    }

    @Override
public Searchholder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.search_item_layout,parent,false);
        Searchholder miaoholder = new Searchholder(view);
        return miaoholder;
    }

    @Override
public void onBindViewHolder(final Searchholder holder, final int position) {
        final String[] split = data.get(position).getImages().split("\\|");
        ImageLoader.getInstance().displayImage(split[0],holder.search_img, ImageloaderUtil.getDefultOption());
        holder.search_text1.setText(data.get(position).getTitle());
        holder.search_text2.setText("¥"+data.get(position).getPrice()+".00");
        if (itemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
public void onClick(View view) {
                    itemClickListener.OnItemClickListener(holder.itemView, holder.getLayoutPosition());
                }
            });
        }


    }

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

    public void setOnItemClickListener(MyOnItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

}

Search_adapter_2 介面卡2

package com.example.hongliang1510c20171216;

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.List;


public class Search_adapter_2 extends RecyclerView.Adapter<Searchholder2> {
    Context context;
    List<SerchBean.DataBean> data;
    private MyOnItemClickListener itemClickListener;

    public Search_adapter_2(Context context, List<SerchBean.DataBean> data) {
        this.context = context;
        this.data = data;
    }

    @Override
public Searchholder2 onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.search_list_layout,parent,false);
        Searchholder2 searchholder2 = new Searchholder2(view);
        return searchholder2;
    }

    @Override
public void onBindViewHolder(final Searchholder2 holder, int position) {
        String[] split = data.get(position).getImages().split("\\|");
        ImageLoader.getInstance().displayImage(split[0],holder.search_image_view_2, ImageloaderUtil.getDefultOption());
        holder.search_text3.setText(data.get(position).getTitle());
        holder.search_text4.setText("¥"+data.get(position).getPrice()+".00");
        if (itemClickListener != null) {
            holder.itemView.setOnClickListener(
            
           

相關推薦

OkHttp封裝請求 攔截

1. 專案框架:必須使用MVP; 2. 圖片載入: Universal-Image-Loader或Glide圖片載入框架 3.網路載入框架:OkHttp,二次封裝,採用單例模式,自定義應用攔截器,封裝公共請求引數(注意:必須通過攔截器封裝公共請求引數,否則無法

日誌攔截 +OKHTTP封裝

日誌攔截器類, 請求來了,先在這裡進行處理,可以得到發請求到得到請求消耗多久的時間 作用:可以排查網路請求速度慢的根本原因 1.有可能是我們在請求網路時,客戶端寫了一堆業務邏輯 2.有可能是伺服器端,寫的有問題 3.有可能就是網速不給力 OK

Okhttp封裝,OkhttpClient使用單例模式封裝,回撥封裝成主執行緒,日誌攔截

public class HttpUtils {     private static final String TAG = "HttpUtils";     private static volatile HttpUtils instance;  

無限輪播(Handler+ImageLoader)+OkHttp封裝

今天來搞一下通過網路請求實現無限輪播,我寫了一個小demo與大家分享一下,我是在fragment中操作的,那麼Activity在這裡就不展示了,Activity也就是實現fragment與fragment之間的聯動,所以今天就只給大家分享一下輪播圖涉及到的一些相關程式碼,節省大家的閱讀時間,

EventBus+OkHttp封裝+Fresco

當我們進行專案開發的時候,往往是需要應用程式的各元件、元件與後臺執行緒間進行通訊,比如在子執行緒中進行請求資料,當資料請求完畢後通過Handler或者是廣播通知UI,而兩個Fragment之家可以通過Listener進行通訊等等。當我們的專案越來越複雜,使用Intent、Handler、Br

RecyclerView多條目+Fresco+MVP+OkHttp封裝

RecyclerView在現在公司中開發專案使用的還是比較多的,今天我們一起來交流一下RecyclerView多條目. 今天我使用的有: 網路請求框架----->OkHttp二次封裝 程式碼架構------>MVP 圖片處理框架----->Fresco 載入多條目-----

android開發 之OkHttp封裝(android 訪問網路)

 這個是本人在使用的一個網路請求,根據自己的需求進行修改的,對於自己完全夠用。大家有需要可以根據自己的專案修改成自己需要的。如果有什麼問題,還希望告知。 使用時繼承該類即可 import android.os.Handler; import android.os.Message;

vue+axois 封裝請求+攔截請求鎖+統一處理錯誤碼)

 需求  封裝常用請求  攔截器-請求鎖  統一處理錯誤碼   一、封裝常用的請求   解決痛點:不要每一個模組的api都還要寫get,post,patch請求方法。直接將這些常用的方法封裝好。   解決方案:寫一個類,封裝好常用的請求   部分原始碼如下

android基於開源網絡框架asychhttpclient,封裝為通用網絡請求組件

定義 pen ntc ucc 編寫 stat ner href face 網絡請求是全部App都不可缺少的功能,假設每次開發都重寫一次網絡請求或者將曾經的代碼拷貝到新的App中,不是非常合理,出於此目的,我希望將整個網絡請求框架獨立出來,與業務邏輯分隔開,這

vue中使用axios+Promise封裝ajax請求

首先先安裝axios: 中文文件地址 https://www.kancloud.cn/yunye/axios/234845 安裝 使用 npm: $ npm install axios 使用 bower: $ bower install axios 使用 cdn: <script src

RxJava2+Retrofit2+okHttp封裝

專案Demo已經上傳至github連結本人android小白一枚,在學習android的過程中,我感受很深,在做了這麼多練手的專案之後,我覺得android就像一塊畫板,畫板是白紙,作為android的開發人員,要做的就是運用一切可能,去在畫板上畫出讓人看的懂並且美觀的畫。說

封裝axios請求(React、Vue皆可使用)

日結部落格 04.19.18 HZ 對於每次都要從頁面匯入axios和配置路徑的行為簡直沒完沒了地厭惡,每次後臺修改api地址都得從一大堆頁面裡尋找到那小小的一個axios.get,簡直深惡痛絕 請封裝吧,萬物皆能封裝,封裝治好了你多年的眼疾 封裝更合理的Axios操作

okHttp封裝攔截

---------------------OkhttpUtils------------------------------ package com.ztz.mvpshopcart.okhttp; import java.io.File; import java.uti

okHttp的而封裝,單例模式

 import android.os.Environment; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUn

OkHttp請求攔截,實現請求攔截,列印日誌到logcat

首先定義一個類NetWorkInterceptor實現Interceptor 話不多說,直接粘程式碼: public class NetWorkInterceptor implements Interceptor { public static String TA

基於Senparc的封裝

cti art .exe agent lin article 發送數據 https gty 前段時間用Senparc做微信開發,但是個人感覺不太好用,所以我把Senparc的API用裝飾器模式進行二次封裝。 微信開發者平臺文檔地址:https://mp.weixin.qq.

對jquery中的$.ajax封裝 從而多調用 今天一整天都在想這個事情

send attribute 面試官 clas display str kit || enc 當然了 我封裝的是$.ajax 可以傳參數 多次調用請求接口 為啥我們這地方不註重前端呢 我都不知道為啥去堅持 不說了 上代碼 js文件 $ajax.js $(fun

retrofit+RXjava封裝

static turn mobile 管理 aso ren pre rgb .sh 接入說明:項目中已集成RXjava,RXandroid。Retrofit,為避免包沖突,不須要再次接入。就可以直接使用RXjava,Retrofit的所有api.

封裝CoreData

是否 ken 位置 app gpa rec -m ctc param (1)創建一個Data Model文件。命名為MyModel.xcdatamodeld (2)創建Users表,加入如圖的字段 (3)創建NSManagedObject subclass表實體

cobbler配置要基於PXE 環境,cobbler是pxe環境的封裝

host 鏡像 function 檢查 sel pen random media sed 一:安裝cobbler、httpd yum install -y cobbler httpd 二:啟動cobbler、httpd systemctl start cobblerd.s