php与android的简单交互

PowerShell
• 阅读 9829

前言

web开发有前段与后端之分,其实android也有前后端之分。android开发就相当于手机App的前端。一般都是php+android或者jsp+android开发,所以作为一个合格的android开发人员我们还是有必要了解一下android与后端的简单交互。下面是以php+android交互的简单介绍。

PHP数据接口的定义

php端的开发主要是实现从数据库获取数据,然后将数据制定成json类型,制定供android获取的接口。至于为什么制定成json类型,相信大家都明白,现在android端从服务器中获取的数据都是以json的格式封装的。好了下面开始操作。

数据库表的建立

首先建表定义好提供请求的数据,简单点,上张图:

php与android的简单交互

数据库的连接

建完表后我们就开始在PHP中连接数据库,以pdo的连接方式为例

<?php
/**
 * 连接数据库
 */

try{
    $pdo = new PDO("mysql:host=localhost:3306;dbname=blog;","root","666666");
    //设置编码
    $pdo->exec("set names utf8");
}catch(PDOException $e){
    die("数据库连接失败".$e->getMessage());
}
?>

只要传入本地端口,数据库名,用户名,密码即可。

获取与制定json

连接数据库成功后,就可以遍历表获取所有数据

$sql = "SELECT * FROM blog";

查询与遍历

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

最后将获取到的数据转封装成json类型

print_r(json_encode($list));

用浏览器访问后的数据就是json类型了,我这里访问的是:http://192.168.56.1/WebBlog/j...p"(根据自己本机的ip地址与项目地址)
php与android的简单交互

好了PHP端的就可以到这里结束了,下面进入android端

Android端数据获取

Android端主要的是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的一点知识,今天有点晚,在宿舍要断电断网了,就不展开了。
还是执行我一贯的做法上张效果图吧

效果图

php与android的简单交互

个人技术分享:https://idisfkj.github.io

关注

php与android的简单交互

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
4年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringMvc接受特殊符号参数被转义
WEB开发时,在前端通过get/post方法传递参数的时候 如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义例如该请求: http://localhost:10001/demo/index.do?name张三(1)注:中文()不会出现此种情况后台就收到的实际name值为:  张三&40;1&41;&40;其实为h
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
4年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
PowerShell
PowerShell
Lv1
时间像奔腾澎湃的急湍,它一去无还,毫不留恋。
文章
5
粉丝
0
获赞
0