实验报告七

实验七 网络通信

1、实验目的
(1) 掌握Andriod中web网络通信程序
2、实验要求
(1) 认真填写实验报告,要求附加部分运行界面和主要代码;
(2) 对设计好的程序,检查输出是否符合预期,如有错请分析错误原因并解决;
3、实验内容
(1) 掌握JSON文件的解析,掌握GSon的使用;
(2) 掌握Volley中RequestQueue、JSonRequest、JSonArrayRequest的使用;
(3) 实现一个多Activity的Web服务客户端,主界面可访问学生列表并显示,选择某个学生后在第二个界面详细显示该学生的所有信息;
效果图

再上代码 接着上步骤

文件项目
MainActivity.java
package com.example.network;

import android.content.Intent;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.json.JSONArray;

import java.net.CookieHandler;
import java.net.CookieManager;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    static  final String UrlBase = "http://10.0.1.2/";
    static  final String Urlhome = UrlBase+"piclist.php";

    RecyclerView recyclerView;
    MyRecyclerAdapter adapter;
//    网络请求一个数组,这里面包含学生。(因为json外面的括号是[])
    ArrayList<Student> students;
//     实现从网上拿到json串,转换成学生数组对象
//    请求队列
    RequestQueue queue;
//    新建一个数组请求
    JsonArrayRequest jsonArrayRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recylerview);
//        保留cookie会话 请我的手机模拟浏览器也保留会话
        CookieHandler.setDefault(new CookieManager());
/*
//        新建一个列表布局 朝向垂直
        LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//        recyclerView您的布局是一个列表形式的
        recyclerView.setLayoutManager(manager);
*/
//        用阁式布局来做 新建一个布局
        GridLayoutManager manager1 = new GridLayoutManager(this,2);
//        recyclerView您的布局是一个阁式布局形式的
        recyclerView.setLayoutManager(manager1);
//        recyclerView的适配器
        adapter = new MyRecyclerAdapter();
        recyclerView.setAdapter(adapter);
//        定义一个队列
        queue = Volley.newRequestQueue(this);
//        数组请求
        jsonArrayRequest = new JsonArrayRequest(Urlhome, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
//          json数组转换成学生数组 一句话搞定
                Gson gson = new Gson();
                students = gson.fromJson(response.toString(),new TypeToken<ArrayList<Student>>(){}.getType());
//                通知刷新界面
                adapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
//        把请求加到队列里面
        queue.add(jsonArrayRequest);
    }
    public void Refresh(View view){
        queue.add(jsonArrayRequest);
    }
//    新建一个适配器
    class  MyRecyclerAdapter extends  RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder>{
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
//        先去准备一个显示学生的布局文件
//        从资源文件恢复一个布局文件成视图
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_student,viewGroup,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
//        拿到一个学生
        final Student student = students.get(i);
//        拿到学生后送到布局里面
        viewHolder.textView.setText(student.getStuName());
//        imageView是一个地址 要从网上下载 所以新建一个图片请求
        ImageRequest imageRequest = new ImageRequest(UrlBase + student.getImagePath(), new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
//                请求成功相应一个图片 直接把图片带进viewholder
                viewHolder.imageView.setImageBitmap(response);
            }
        }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
//        把请求加到队列里面
        queue.add(imageRequest);
//        点击某一个时 显示详细信息,由于用到recyclerView 只能在onBindViewHolder里面加
//        加上相应事件
//        我的viewHolder它的itemView(最上面的父视图,点图片也好,名字也好。。。都要切换到下一个界面)
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                定义一个意图来跳转到下一个界面
                Intent intent = new Intent(MainActivity.this,StudentActivity.class);
//                学生定义成final 且实现序列化
                intent.putExtra("student",student);
                startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        if(students == null) return 0;
//        返回学生的大小
        return students.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
//        令你新建布局文件里面的东东
        ImageView imageView;
        TextView textView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
            textView = itemView.findViewById(R.id.textView);
        }
    }
}
}

Student.java
package com.example.network;

import java.io.Serializable;

public class Student implements Serializable {
//    这些名字需要与json 的命名相同
    private String stuName;
    private String stuNo;
    private String stuGender;
    private String imagePath;
    private String stuClass;

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public String getStuGender() {
        return stuGender;
    }

    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public String getStuClass() {
        return stuClass;
    }

    public void setStuClass(String stuClass) {
        this.stuClass = stuClass;
    }
}

StudentActivity.java
package com.example.network;

import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;

public class StudentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student);
//        得到意图
        Intent intent = getIntent();
//        恢复学生
        Student student = (Student) intent.getSerializableExtra("student");
        TextView text_name = findViewById(R.id.text_name);
        TextView text_gender = findViewById(R.id.text_gender);
        TextView text_class = findViewById(R.id.text_class);
        text_name.setText("姓名: "+student.getStuName());
        text_gender.setText("性别: "+student.getStuGender());
        text_class.setText("班级: "+student.getStuClass());
//        里面访问了所以要生成final
        final ImageView imageView = findViewById(R.id.imageView2);
//        又从网上下载图片
//        新建一个队列 或者 在MainActivity.java把队列定义成整个app共享 如下;
//        queue = Volley.newRequestQueue(getApplicationContext()); 这个java文件还是要加上这句 所以我再新建一个
        RequestQueue queue = Volley.newRequestQueue(this);
        ImageRequest imageRequest = new ImageRequest(MainActivity.UrlBase + student.getImagePath(), new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                imageView.setImageBitmap(response);
            }
        }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
//        把请求加到队列里面
        queue.add(imageRequest);
    }
}

新建工程
需要支持的权限(不能有注释,请剔除)
在主界面拖入,RecyclerView定义一个id
button定义一个点击事件
在 mainAvtivity.java新建适配器时 注意new
新建学生类
查看我们的json
新建布局文件
新建layout_student.xml的布局文件中拖入一个imageView
layout_student.xml
在build.gradel中引入工具
新建数组请求时细节1
新建数组请求时细节2
新建图片请求时细节
新建详细信息的活动
详细信息活动界面布局细节1
详细信息活动界面布局细节2
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容