OkHttp二次封裝請求 攔截器
1. 專案框架:必須使用MVP;
2. 圖片載入: Universal-Image-Loader或Glide圖片載入框架
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