Android和JAVA后台实现数据通信

  • 前言
  • 项目介绍
    • 目录结构介绍
  • 功能介绍
    • 登陆功能
      • 特别重要
    • 网络请求封装类
    • 注册功能
    • 列表显示功能

前言

进行综合设计的时候,要求做个javaweb项目并挂到服务器上,与此同时在Android上通过访问后台接口实现部分功能。经过了一番的摸索和踩坑,终于实现了和后台服务的通信登陆注册和信息列表显示功能。这是 github 地址,先看一下效果。

项目介绍

目录结构介绍

Android通过JSON数据格式和java服务后台进行数据交互_第1张图片

功能介绍

登陆功能

首先在layout目录下新建xml文件进行布局和定义样式,然后注册事件进行监听,通过intent对象控制activity的跳转,MainActivity类

public class MainActivity extends Activity implements OnClickListener{//声明全局控件private EditText mPhoneNumberEditText;    private EditText mPassWordEditText;    private Button mLoginButton, mRegisterButton;    private RadioButton admin, user;    private String originAddress = "http://47.97.193.151/parkingsystem2/Login"; //登陆请求的网址接口        Handler mHandler = new Handler(){          @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            String result = "";            if ("OK".equals(msg.obj.toString())){                result = "success";            }else if ("Wrong".equals(msg.obj.toString())){                result = "fail";            }else {            String data = msg.obj.toString();//            Toast.makeText(MainActivity.this, data, Toast.LENGTH_LONG).show();            try {JSONObject jsonObject = new JSONObject(data);String code = jsonObject.getString("code");if (code.equals("1")) {result = jsonObject.getString("data");//通过Bundle封装数据在intent对象中,传递到不同的activityBundle bundle = new Bundle();bundle.putString("data", result);//通过Intent控制Activity跳转Intent intent = new Intent();intent.setClass(MainActivity.this, ListActivity.class);intent.putExtras(bundle);finish();startActivity(intent);}else {result = jsonObject.getString("data");Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}            }                    }    };    @Override    protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initEvent();    }    //初始化控件方法    private void initView() {        mPhoneNumberEditText = (EditText) findViewById(R.id.phoneNumberEditText);        mPassWordEditText = (EditText) findViewById(R.id.passwordEditText);        mLoginButton = (Button) findViewById(R.id.loginButton);        mRegisterButton = (Button) findViewById(R.id.registerButton);        admin = (RadioButton)findViewById(R.id.admin);        user = (RadioButton)findViewById(R.id.user);    }    //注册事件方法    private void initEvent() {        mLoginButton.setOnClickListener(this);        mRegisterButton.setOnClickListener(this);    }        private boolean isInputValid() {        //检查用户输入的合法性,这里暂且默认用户输入合法        return true;    }    //实现接口onCreate方法    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.loginButton:{                login();//调用登陆方法                break;            }            case R.id.registerButton: {            register();//调用注册方法            break;            }        }    }    //跳转到注册界面    public void register() {Intent intent = new Intent();intent.setClass(MainActivity.this, RegisterActivity.class);  //跳转startActivity(intent);  //启动finish();}    //登陆    public void login() {        //取得用户输入的账号和密码        if (!isInputValid()){            return;        }        String number = mPhoneNumberEditText.getText().toString().trim();        String password = mPassWordEditText.getText().toString().trim();        if (number.isEmpty()) {        Toast.makeText(MainActivity.this, "账号不能为空!", Toast.LENGTH_LONG).show();        return;}else if (password.isEmpty()) {Toast.makeText(MainActivity.this, "密码不能为空!", Toast.LENGTH_LONG).show();return;}else if (!admin.isChecked() && !user.isChecked()) {Toast.makeText(MainActivity.this, "请选择权限!", Toast.LENGTH_LONG).show();return;}        HashMap<String, String> params = new HashMap<String, String>();        params.put(User.USERNAME, number);        params.put(User.PASSWORD, password);        if (admin.isChecked()) {        params.put(User.POWER, "1");}else if (user.isChecked()) {params.put(User.POWER, "2");}                try {        //发起HTTP请求            String compeletedURL = HttpUtil.getURLWithParams(originAddress, params); //originAddress请求地址, params请求参数            HttpUtil.sendHttpRequest(compeletedURL, new HttpCallbackListener() {                @Override                public void onFinish(String response) {//请求回调函数,response是响应的数据                    Message message = new Message();                    message.obj = response;                    mHandler.sendMessage(message);    //给Handlder传递数据                }                @Override                public void onError(Exception e) {                    Message message = new Message();                    message.obj = e.toString();                    mHandler.sendMessage(message);                }            });        } catch (Exception e) {            e.printStackTrace();        }    }}

特别重要

在进行Activity跳转时,需要在 AndroidMainfest.xml 配置文件注册,同时网络请求也要配置允许设置。
Android通过JSON数据格式和java服务后台进行数据交互_第2张图片

网络请求封装类

public class HttpUtil {    //封装的发送请求函数    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {        if (!HttpUtil.isNetworkAvailable()){            //这里写相应的网络设置处理            return;        }        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                try{                    URL url = new URL(address);                    //使用HttpURLConnection                    connection = (HttpURLConnection) url.openConnection();                    //设置方法和参数                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    connection.setDoInput(true);                    connection.setDoOutput(true);                    //获取返回结果                    InputStream inputStream = connection.getInputStream();                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));                    StringBuilder response = new StringBuilder();                    String line;                    while ((line = reader.readLine()) != null){                        response.append(line);                    }                    //成功则回调onFinish                    if (listener != null){                        listener.onFinish(response.toString());                    }                } catch (Exception e) {                    e.printStackTrace();                    //出现异常则回调onError                    if (listener != null){                        listener.onError(e);                    }                }finally {                    if (connection != null){                        connection.disconnect();                    }                }            }        }).start();    }    //组装出带参数的完整URL    public static String getURLWithParams(String address,HashMap<String,String> params) throws UnsupportedEncodingException {        //设置编码        final String encode = "UTF-8";        StringBuilder url = new StringBuilder(address);        url.append("?");        //将map中的key,value构造进入URL中        for(Map.Entry<String, String> entry:params.entrySet())        {            url.append(entry.getKey()).append("=");            url.append(URLEncoder.encode(entry.getValue(), encode));            url.append("&");        }        //删掉最后一个&        url.deleteCharAt(url.length() - 1);        return url.toString();    }    //判断当前网络是否可用    public static boolean isNetworkAvailable(){        return true;    }}回调监听接口类public interface HttpCallbackListener {void onFinish(String response);    void onError(Exception e);}

注册功能

注册功能和登陆功能基本流程相同,只不过增加了两个控件,请求的接口一样,不过请求的参数不一样,具体流程可以参考下 github 的源码

列表显示功能

登陆成功后,后台服务响应返回一个 json 数据格式的数据,需要解析 json 格式数据并显示在列表上

{"code":1,"data":[{"cardtype":"VIP","cartype":"小型车","id":1,"number":"111","sum":"¥1011","time":"每小时"},{"cardtype":"VIP","cartype":"中型车","id":2,"number":"112","sum":"¥12","time":"每小时"},{"cardtype":"VIP","cartype":"大型车","id":3,"number":"113","sum":"¥15","time":"每小时"},{"cardtype":"普通卡","cartype":"小型车","id":4,"number":"114","sum":"¥15","time":"每小时"},{"cardtype":"普通卡","cartype":"中型车","id":5,"number":"115","sum":"¥20","time":"每小时"},{"cardtype":"普通卡","cartype":"大型车","id":6,"number":"116","sum":"¥25","time":"每小时"}]}

借助 JSONArrayJSONObject 两个对象将 json 数据 通过哈希值hash存放在 ArrayList 对象上,然后通过 simpleAdapter 适配器将 hash 的键list_item_activity.xml文件 的控件 id 项对应显示列表

public class ListActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {ListView listView;  //声明一个ListView对象// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//获取intent对象上的传过来的数据Bundle myBundle = this.getIntent().getExtras();String data = myBundle.getString("data");setContentView(R.layout.list_activity);//存放json数据List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();try {JSONArray jsonArray = new JSONArray(data);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = (JSONObject)jsonArray.get(i);HashMap<String, String> map = new HashMap<String, String>();map.put("id",jsonObject.getString("id"));map.put("enterPort",jsonObject.getString("cardtype"));map.put("exitPort",jsonObject.getString("cartype"));map.put("parkName",jsonObject.getString("number"));map.put("parkTel",jsonObject.getString("sum"));map.put("parkTotal",jsonObject.getString("time"));list.add(map);}} catch (JSONException e) {e.printStackTrace();}String[] str = new String[]{"id", "enterPort", "exitPort", "parkName", "parkTel", "parkTotal"}; //数组存放对应上面hash的键int[] rId = new int[]{R.id.park_id, R.id.enter, R.id.exit, R.id.parkname, R.id.phone, R.id.total}; //对应list_item.activity.xml文件的控件idSimpleAdapter simpleAdapter = new SimpleAdapter(ListActivity.this, list, R.layout.list_item_activity, str, rId); //参数,第一个是列表Activity的类,第二个参数是ArrayList数据,第三个参数是list_item_activity的layout的id,第四和第五对应上面的两个数据,分别为hash键数组和控件id数组listView = (ListView)this.findViewById(R.id.listview);listView.setAdapter(simpleAdapter);}}

更多相关文章

  1. android修改控件外观(使用drawable资源)
  2. Android (安卓数据的五种存储方式)
  3. 基于xml类型的压缩数据流的android获取天气的方法
  4. 最新消息:Android 4.0新增功能
  5. Android的功能特性简介
  6. 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V
  7. android 从文件制定位置读取数据
  8. Android---8---Intent及使用Intent传递数据
  9. android studio查找应用控件id实现自动化测试

随机推荐

  1. Android(安卓)新手摸石头过河
  2. Android(安卓)点击空白处隐藏键盘
  3. Android出现adb device offline
  4. Android(安卓)kernel 下载编译笔记
  5. Transport endpoint is not connected 报
  6. android Button或者ImageButton背景透明
  7. Android(安卓)RIL源码分析
  8. Android黑名单电话挂断(AIDL)
  9. android TextView属性详解
  10. android中The connection to adb is down