php與android的簡單交互


前言

web開發有前段與後端之分,其實android也有先後端之分。android開發就至關於手機App的前端。通常都是php+android或者jsp+android開發,因此做爲一個合格的android開發人員咱們仍是有必要了解一下android與後端的簡單交互。下面是以php+android交互的簡單介紹。php

PHP數據接口的定義

php端的開發主要是實現從數據庫獲取數據,而後將數據制定成json類型,制定供android獲取的接口。至於爲何制定成json類型,相信你們都明白,如今android端從服務器中獲取的數據都是以json的格式封裝的。好了下面開始操做。前端

數據庫表的創建

首先建表定義好提供請求的數據,簡單點,上張圖:mysql

圖片描述

數據庫的鏈接

建完表後咱們就開始在PHP中鏈接數據庫,以pdo的鏈接方式爲例android

<?php
/**
 * 鏈接數據庫
 */

try{
    $pdo = new PDO("mysql:host=localhost:3306;dbname=blog;","root","666666");
    //設置編碼
    $pdo->exec("set names utf8");
}catch(PDOException $e){
    die("數據庫鏈接失敗".$e->getMessage());
}
?>

只要傳入本地端口,數據庫名,用戶名,密碼便可。git

獲取與制定json

鏈接數據庫成功後,就能夠遍歷表獲取全部數據github

$sql = "SELECT * FROM blog";

查詢與遍歷web

$stmt = $pdo->query($sql);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $list["blog"][] = $row;
}

最後將獲取到的數據轉封裝成json類型sql

print_r(json_encode($list));

用瀏覽器訪問後的數據就是json類型了,我這裏訪問的是:http://192.168.56.1/WebBlog/j...p"(根據本身本機的ip地址與項目地址)
圖片描述數據庫

好了PHP端的就能夠到這裏結束了,下面進入android端

Android端數據獲取

Android端主要的是json實體類的創建與從咱們上面定義的藉口獲取數據,因此這裏要用到網絡請求,獲取數據,而後在顯示出來,下面簡單的介紹下。json

Json實體類的定義

這裏主要推薦一個工具,把GsonFormat集成到AS中,能夠很方便的生成實體類。若是不使用的話,就要根據前面定義的數據類型來進行一一對應。下面是我按上面的類型定義的實體類

private List<BlogBean> blog;

    public List<BlogBean> getBlog() {
        return blog;
    }

    public void setBlog(List<BlogBean> 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;
        }

自定義GsonRequest

咱們使用volleygson來解析json數據,首先我先自定義GsonRequest,這裏須要繼承volleyRequest

public class GsonRequest<T> extends Request<T> {

    private Class<T> mClass;
    private final Response.Listener<T> mListener;
    private Gson mGson;
    private List<T> mList;

    public GsonRequest(int method, String url, Class<T> tClass, Response.Listener<T> listener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mClass = tClass;
        mListener = listener;
        mGson = new Gson();
    }

    public GsonRequest(String url, Class<T> tClass, Response.Listener<T> listener, Response.ErrorListener errorListener) {
        this(Method.GET, url, tClass, listener, errorListener);
    }

    @Override
    protected Response<T> 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);
    }
}

Volley網絡請求數據

使用咱們上面自定義的GsonRequest來請求數據

String url = "http://192.168.56.1/WebBlog/json/getBlogJson.php";
        GsonRequest<BlogInfo> gsonRequest = new GsonRequest<BlogInfo>(url, BlogInfo.class, new Response.Listener<BlogInfo>() {
            @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");

數據在onResponse中請求到了,存儲到List集合中,經過設置adapter顯示獲取的數據,這裏就不展開adapter的使用

網絡請求圖片與緩存

仍是說下網絡請求圖片與圖片的緩存處理,也是經過volley的實現,因此咱們能夠一套的使用volley就能夠實現許多基本的網絡請求。
使用到的是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來加載網絡圖片與緩存圖片

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的網絡請求不止這些,就拿圖片的請求,還有直接使用ImageRequestNetworkImageView,原本還想說點webview的一點知識,今天有點晚,在宿舍要斷電斷網了,就不展開了。
仍是執行我一向的作法上張效果圖吧

效果圖

圖片描述

我的技術分享:https://idisfkj.github.io

關注

clipboard.png

相關文章
相關標籤/搜索