博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android获取服务器Json字符串并显示在ListView上面
阅读量:4703 次
发布时间:2019-06-10

本文共 9826 字,大约阅读时间需要 32 分钟。

已经好久没有更新博客,今天终于有新的东西可以记录了。

通过这次的任务学习到了以前没有注意到的知识点,真的有种书读百遍,其义自见的感觉。这次又重新认识了《Handler消息机制原理》。这次的任务中有更新UI。但是忘记了在Android4.0以后不能在UI线程访问网络,子线程也不能更新UI界面。下面我来展示一下这次的效果图。

这次的任务是:获取服务器端的json字符串,并解析显示在Android界面上。

当我接到这个任务的时候,首先想到的是利用Fragment布局加上ListView布局。但是因为没有完全掌握,所以失败了。这是就想到了现在的方案。利用GridView加上ListView来实现。布局是没有问题。但是写代码的时候却出现了问题。当我获取到数据并顺利解析的时候。却怎么也传不到ListView。总是显示它的size为0.但是通过打印确实获取到了。这个时候老师让我利用Handler,便能顺利解决问题了。原因就是一开始,我写到的不能在子线程更新UI。

下面我来粘出我的代码以供大家参考:

activity_main.xml

 

item_gridview.xml

activity_select.xml

 

item_listview.xml

MainActivity.java

package com.rjxy.student;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.TextView;public class MainActivity extends Activity {    private GridView gv_Home;    private String[] settingText = {"全部题目","我的选题","个人信息","我的密码"};        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        gv_Home = (GridView) findViewById(R.id.gv_icons);        gv_Home.setAdapter(new MyAdapter());        gv_Home.setOnItemClickListener(new OnItemClickListener() {                    @Override            public void onItemClick(AdapterView
adapter, View view, int position, long id) { System.out.println(position); switch (position) { case 0: //查看全部题目 Intent intent = new Intent(MainActivity.this,SetlectActivity.class); startActivity(intent); break; case 1: //我的选题 break; case 2: //个人信息 break; case 3: //修改密码 break; default: break; } } }); }class MyAdapter extends BaseAdapter{ @Override public int getCount() { return settingText.length; } @Override public Object getItem(int position) { return settingText[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = View.inflate(getApplicationContext(), R.layout.item_gridview, null); TextView tv_Home = (TextView) view.findViewById(R.id.tv_icons); tv_Home.setText(settingText[position]); return view; } } }

SetlectActivity.java

package com.rjxy.student;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class SetlectActivity extends Activity {    private static final int CHANGE_UI = 1;    private static final int ERROR = 2;    private ListView lv;    private List datas = new ArrayList();    //主线程创建消息处理器    private Handler handler = new Handler(){        public void handleMessage(android.os.Message msg) {            if (msg.what == CHANGE_UI) {                try {                    JSONArray arr = new JSONArray((String)msg.obj);                        for (int i = 0; i < arr.length(); i++) {                             JSONObject temp = (JSONObject) arr.get(i);                          // Log.d("json", temp.getInt("id")+temp.getString("exp_name")+temp.getString("exp_tech"));                          Data data = new Data();                                                        data.setId(temp.getInt("id"));                                               data.setExp_name(temp.getString("exp_name"));                          data.setExp_tech(temp.getString("exp_tech"));                                                   //这个地方可以获取到值但是适配器那位0                          datas.add(data);                                                                         }                      lv.setAdapter(new MyAdapter());                } catch (JSONException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }             }        };    };            @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_select);        lv = (ListView) findViewById(R.id.lv);        select();                                    }                        private void select(){        //子线程更新UI         new Thread(){                public void run(){                    StringBuilder builder = new StringBuilder();                    HttpClient client = new DefaultHttpClient();                    String path = "http://10.6.78.254:2016/xampp/graduate/index.php/home/Student/test_android";                            HttpGet httpGet = new HttpGet(path);                    try {                    HttpResponse response = client.execute(httpGet);                    StatusLine statusLine = response.getStatusLine();                    int statusCode = statusLine.getStatusCode();                    if (statusCode == 200) {                                                                      BufferedReader reader = new BufferedReader                                  (new InputStreamReader(response.getEntity().getContent(),"UTF-8"));                          for(String s=reader.readLine();s!=null;s=reader.readLine())                          {                              builder.append(s);                          }                          String content = builder.toString();                        //通知主线程更新UI                          Message message = new Message();                          message.what = CHANGE_UI;                          message.obj = content;                          handler.sendMessage(message);                    }else{                        Log.e(MainActivity.class.toString(), "Failed");                    }                } catch (ClientProtocolException e) {                                        e.printStackTrace();                } catch (IOException e) {                                        e.printStackTrace();                }                                                        };            }.start();    }     class MyAdapter extends BaseAdapter{            @Override            public int getCount() {                Log.d("AAA", ""+datas.size());                        return datas.size();                                                }            @Override            public Object getItem(int position) {                        return datas.get(position);            }            @Override            public long getItemId(int position) {                                return position;            }                        @Override            public View getView(int position, View convertView, ViewGroup parent) {                View view = View.inflate(SetlectActivity.this, R.layout.item_listview, null);                TextView id = (TextView) view.findViewById(R.id.tv_id);                TextView exp_name = (TextView) view.findViewById(R.id.tv_name);                TextView exp_tech = (TextView) view.findViewById(R.id.tv_tech);                Data data = datas.get(position);                Log.d("aaaaa",datas.get(position).getExp_name() );                                id.setText(String.valueOf(datas.get(position).getId()));                exp_name.setText(datas.get(position).getExp_name());                //Log.i("exp_name", datas.get(position).getExp_name());                exp_tech.setText(datas.get(position).getExp_tech());                            return view;            }                 }}

Data.java

package com.rjxy.student;public class Data {    private int id;    private String exp_name;    private String exp_tech;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getExp_name() {        return exp_name;    }    public void setExp_name(String exp_name) {        this.exp_name = exp_name;    }    public String getExp_tech() {        return exp_tech;    }    public void setExp_tech(String exp_tech) {        this.exp_tech = exp_tech;    }    @Override    public String toString() {        return "Data [id=" + id + ", exp_name=" + exp_name + ", exp_tech="                + exp_tech + "]";    }    }

添加权限:

 服务器端的代码:ThinkPHP代码为:

public function test_android(){                $myModel = new \Think\Model();        $result=$myModel->query("select id,exp_name,exp_tech from g_experiment ;");                echo json_encode($result);        }

 

转载于:https://www.cnblogs.com/kangyaping/p/5886728.html

你可能感兴趣的文章
欧拉定理证明&阶乘的逆元
查看>>
Prime Game Gym - 101981J(网络流/二分图)
查看>>
Teamwork Gym - 101492E (dp)
查看>>
No Link, Cut Tree! Gym - 101484F(dp)
查看>>
Coprimes Gym - 101492C(bitset)
查看>>
Partial Tree UVALive - 7190(完全背包)
查看>>
『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)
查看>>
『开发技术』Windows极简安装使用face_recognition实现人脸识别
查看>>
『深度应用』NLP命名实体识别(NER)开源实战教程
查看>>
『开发技术』GPU训练加速原理(附KerasGPU训练技巧)
查看>>
『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
查看>>
『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)
查看>>
『王霸之路』从0.1到2.0一文看尽TensorFlow奋斗史
查看>>
系统测试中需要注意的点
查看>>
Elasticsearch TermQuery 详解
查看>>
一个困扰了我N久的bug , android.enableAapt2=false 无效
查看>>
查看客户端的IP地址,机器名,MAC地址,登陆名等信息
查看>>
移动端经常遇到的小bug
查看>>
网络&热恋NSURLConnection代理及GET¥POST请求
查看>>
SshTerminal
查看>>