摘要:前言開發(fā)有前段與后端之分,其實也有前后端之分。一般都是或者開發(fā),所以作為一個合格的開發(fā)人員我們還是有必要了解一下與后端的簡單交互。數(shù)據(jù)接口的定義端的開發(fā)主要是實現(xiàn)從數(shù)據(jù)庫獲取數(shù)據(jù),然后將數(shù)據(jù)制定成類型,制定供獲取的接口。
web開發(fā)有前段與后端之分,其實android也有前后端之分。android開發(fā)就相當于手機App的前端。一般都是php+android或者jsp+android開發(fā),所以作為一個合格的android開發(fā)人員我們還是有必要了解一下android與后端的簡單交互。下面是以php+android交互的簡單介紹。
PHP數(shù)據(jù)接口的定義php端的開發(fā)主要是實現(xiàn)從數(shù)據(jù)庫獲取數(shù)據(jù),然后將數(shù)據(jù)制定成json類型,制定供android獲取的接口。至于為什么制定成json類型,相信大家都明白,現(xiàn)在android端從服務(wù)器中獲取的數(shù)據(jù)都是以json的格式封裝的。好了下面開始操作。
數(shù)據(jù)庫表的建立首先建表定義好提供請求的數(shù)據(jù),簡單點,上張圖:
數(shù)據(jù)庫的連接建完表后我們就開始在PHP中連接數(shù)據(jù)庫,以pdo的連接方式為例
exec("set names utf8"); }catch(PDOException $e){ die("數(shù)據(jù)庫連接失敗".$e->getMessage()); } ?>
只要傳入本地端口,數(shù)據(jù)庫名,用戶名,密碼即可。
獲取與制定json連接數(shù)據(jù)庫成功后,就可以遍歷表獲取所有數(shù)據(jù)
$sql = "SELECT * FROM blog";
查詢與遍歷
$stmt = $pdo->query($sql); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $list["blog"][] = $row; }
最后將獲取到的數(shù)據(jù)轉(zhuǎn)封裝成json類型
print_r(json_encode($list));
用瀏覽器訪問后的數(shù)據(jù)就是json類型了,我這里訪問的是:http://192.168.56.1/WebBlog/j...p"(根據(jù)自己本機的ip地址與項目地址)
好了PHP端的就可以到這里結(jié)束了,下面進入android端Android端數(shù)據(jù)獲取
Android端主要的是json實體類的建立與從我們上面定義的借口獲取數(shù)據(jù),所以這里要用到網(wǎng)絡(luò)請求,獲取數(shù)據(jù),然后在顯示出來,下面簡單的介紹下。
Json實體類的定義這里主要推薦一個工具,把GsonFormat集成到AS中,可以很方便的生成實體類。如果不使用的話,就要根據(jù)前面定義的數(shù)據(jù)類型來進行一一對應(yīng)。下面是我按上面的類型定義的實體類
private List自定義GsonRequestblog; public List getBlog() { return blog; } public void setBlog(List blog) { this.blog = blog; } public static class BlogBean { private String id; private String title; private String time; private String content_url; private String image_url; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getContent_url() { return content_url; } public void setContent_url(String content_url) { this.content_url = content_url; } public String getImage_url() { return image_url; } public void setImage_url(String image_url) { this.image_url = image_url; }
我們使用volley與gson來解析json數(shù)據(jù),首先我先自定義GsonRequest,這里需要繼承volley的Request
public class GsonRequestVolley網(wǎng)絡(luò)請求數(shù)據(jù)extends Request { private Class mClass; private final Response.Listener mListener; private Gson mGson; private List mList; public GsonRequest(int method, String url, Class tClass, Response.Listener listener, Response.ErrorListener errorListener) { super(method, url, errorListener); mClass = tClass; mListener = listener; mGson = new Gson(); } public GsonRequest(String url, Class tClass, Response.Listener listener, Response.ErrorListener errorListener) { this(Method.GET, url, tClass, listener, errorListener); } @Override protected Response parseNetworkResponse(NetworkResponse networkResponse) { try { mList = new ArrayList<>(); String jsonString = new String(networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers)); return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(networkResponse)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(T t) { mListener.onResponse(t); } }
使用我們上面自定義的GsonRequest來請求數(shù)據(jù)
String url = "http://192.168.56.1/WebBlog/json/getBlogJson.php"; GsonRequestgsonRequest = new GsonRequest (url, BlogInfo.class, new Response.Listener () { @Override public void onResponse(BlogInfo info) { mList = info.getBlog(); BlogAdapter mAdapter = new BlogAdapter(MainActivity.this,mList,R.layout.blog_item); blogLv.setAdapter(mAdapter); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("TAG", volleyError.getMessage(), volleyError); } }); //添加到請求隊列中 RequestManager.addRequest(gsonRequest, "blogRequest");
數(shù)據(jù)在onResponse中請求到了,存儲到List集合中,通過設(shè)置adapter顯示獲取的數(shù)據(jù),這里就不展開adapter的使用
網(wǎng)絡(luò)請求圖片與緩存還是說下網(wǎng)絡(luò)請求圖片與圖片的緩存處理,也是通過volley的實現(xiàn),所以我們可以一套的使用volley就可以實現(xiàn)許多基本的網(wǎng)絡(luò)請求。
使用到的是LruCache,所以我可以繼承它
@Override protected int sizeOf(String key, Bitmap value) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR1){ return value.getByteCount(); } return value.getRowBytes() * value.getHeight(); } @Override public Bitmap getBitmap(String s) { return get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { put(s,bitmap); }
然后再自定義ImageCacheManager
public class ImageCacheManager { private static final int CACHE_SIZE = 1024 * 1024 * ((ActivityManager) App.getAppContext() .getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass() / 8; public ImageCacheManager() { } private static ImageLoader mImageLoader = new ImageLoader(RequestManager.mRequestQueue, new BitmapLruCache(CACHE_SIZE)); public static ImageLoader.ImageContainer loadImage(String requestUrl, ImageLoader.ImageListener listener, int maxWidth, int maxHeight) { return mImageLoader.get(requestUrl, listener, maxWidth, maxHeight); } public static ImageLoader.ImageContainer loadImage(String requestUrl, ImageLoader.ImageListener listener) { return loadImage(requestUrl, listener, 0, 0); } public static ImageLoader.ImageListener getImageListener(final ImageView view, final Drawable defaultImageDrawable, final Drawable errorImageDrawable) { return new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) { if (imageContainer.getBitmap() != null) { if (!b && defaultImageDrawable != null) { TransitionDrawable transitionDrawable = new TransitionDrawable( new Drawable[]{defaultImageDrawable , new BitmapDrawable(App.getAppContext().getResources(), imageContainer.getBitmap())} ); transitionDrawable.setCrossFadeEnabled(true); view.setImageDrawable(transitionDrawable); transitionDrawable.startTransition(100); } else { view.setImageBitmap(imageContainer.getBitmap()); } } else if (defaultImageDrawable != null) { view.setImageDrawable(defaultImageDrawable); } } @Override public void onErrorResponse(VolleyError volleyError) { if (errorImageDrawable != null) { view.setImageDrawable(errorImageDrawable); } Log.e("TAG",volleyError.getMessage()); } }; } }
最后就可以通過使用ImageCacheManager來加載網(wǎng)絡(luò)圖片與緩存圖片
ImageCacheManager.loadImage(mList.get(position).getImage_url() , ImageCacheManager.getImageListener((ImageView) holder.getView(R.id.item_image) , App.getAppContext().getResources().getDrawable(R.drawable.blog_default), App.getAppContext().getResources().getDrawable(R.drawable.blog_default)) ,0,0);
當然volley的網(wǎng)絡(luò)請求不止這些,就拿圖片的請求,還有直接使用ImageRequest與NetworkImageView,本來還想說點webview的一點知識,今天有點晚,在宿舍要斷電斷網(wǎng)了,就不展開了。
還是執(zhí)行我一貫的做法上張效果圖吧
個人技術(shù)分享:https://idisfkj.github.io
關(guān)注文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21529.html
摘要:注意對這個有點不兼容,所以,謹慎,,,安卓均可以實現(xiàn)獲取版本信息這里需要判斷系統(tǒng)類型及版本所以,由此可見其實這里的判斷會很多,很多,很多。 其實應(yīng)該更多的是互相的磨合與學習,希望身邊的人可以有自己的經(jīng)驗分享,與理解,互相進步才是大家需要的,作為一個 年老 (我也是90后) 的開發(fā)者,我覺得一代勝一代,未來才有勝算。額,好了,我不充當老師的角色了,去正題。 1. 安卓中 a 標簽的坑 在...
摘要:注意對這個有點不兼容,所以,謹慎,,,安卓均可以實現(xiàn)獲取版本信息這里需要判斷系統(tǒng)類型及版本所以,由此可見其實這里的判斷會很多,很多,很多。 其實應(yīng)該更多的是互相的磨合與學習,希望身邊的人可以有自己的經(jīng)驗分享,與理解,互相進步才是大家需要的,作為一個 年老 (我也是90后) 的開發(fā)者,我覺得一代勝一代,未來才有勝算。額,好了,我不充當老師的角色了,去正題。 1. 安卓中 a 標簽的坑 在...
閱讀 2970·2021-11-22 15:25
閱讀 2251·2021-11-18 10:07
閱讀 1057·2019-08-29 15:29
閱讀 483·2019-08-29 13:25
閱讀 1515·2019-08-29 12:58
閱讀 3211·2019-08-29 12:55
閱讀 2923·2019-08-29 12:28
閱讀 514·2019-08-29 12:16