Android+PHP+MySQL实现新闻列表(二)

来源:互联网 发布:可可粉推荐知乎 编辑:程序博客网 时间:2024/06/05 07:36

前面一篇说完来页面布局,总得来说页面在adapter中设置布局,ListView.setAdapter(Adapter)来加载视图样子。接下来就看看网络通信这一部分

新建一个网络通信类HttpUtils,在里面写网络请求和处理

首先定义一个getNewsJson方法,实现从数据库读取数据并得到的JSON数据。新开一个线程来处理,因为不能在主线程处理网络请求,因为一旦请求时间长一点有可能就导致主线程卡死了,停止运行,所以要新开线程,这一点在线程那也说过。网络通信 我们使用HTTP来访问网络,HttpURLConnection继承URLConnection操作Http方便快捷

具体步骤:

1.创建URL对象,并且通过url.openConnection()来连接网络

2.设置请求方式为GET,POST用于数据提交

3.返回HttpURLConnection对应的输入流,获取响应内容

这里用到的是getInputStream(),对应的getOutputStream()是返回输出流,用于向HttpURLConnection发送请求参数

4.定义BufferedReader输入流读取URL响应

5.定义StringBuilder来将读取结果添加在一起形成String

6.用handler.sendMessage()将响应内容发给主线程 ,通知主线程更新


前面也提到了,像时间啊标题之类的都可以直接从数据库获取,但是图片需要网络请求,所以我们在网络请求类中需要加上图片的处理

我们写一个setBitmap()方法,来实现从网络链接中获取图片并显示

前面步骤相同,值得说的是BitmapFactory是一个工具类,有大量可以从不同数据源解析创建Bitmap对象,其中decodeStream(InputStream is)用于从指定输入流解析创建Bitmap对象

<pre name="code" class="plain">package com.news;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;import android.os.Message;import android.util.Log;import android.widget.ImageView;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;/** * Created by Administrator on 2016-08-25. */public class HttpUtils {    public  static  void getNewsJson(final String url,final Handler handler){        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection conn;                InputStream is;                try {                    conn = (HttpURLConnection) new URL(url).openConnection();   //打开网络连接                    conn.setRequestMethod("GET");   //设置发送请求方式是GET                    is = conn.getInputStream();     // 返回对应输入流,获取响应内容                    BufferedReader br = new BufferedReader(new InputStreamReader(is));  //定义BufferedReader输入流读取URL响应                    String line= "";                    StringBuilder result = new StringBuilder();     //定义StringBuilder来将读取结果添加成 一个string                    while ((line = br.readLine())!=null){                        result.append(line);                    }                    Message message = new Message();                    message.obj = result.toString();                    handler.sendMessage(message);                    System.out.println(message);                    Log.e("TAG","333333333");                } catch (Exception e) {                    e.printStackTrace();                }            }        }).start();    }    public static void setBitmap(final ImageView img,final  String img_url){        new Thread(new Runnable() {            @Override            public void run() {                try {                    HttpURLConnection  conn = (HttpURLConnection) new URL(img_url).openConnection();                    conn.connect();                    InputStream is = conn.getInputStream();                    Bitmap bitmap = BitmapFactory.decodeStream(is);     //从输入流解析创建Bitmap                    img.setImageBitmap(bitmap);     //设置ImageView要显示的图片                    is.close();                } catch (Exception e) {                    e.printStackTrace();                }            }        }).start();    }}


到此网络请求 这一部分就算是写完了,接下来就是在MainActivity解析JSON数据了

先是把getJson.php得到

1.新建一个Handler,用于处理数据,在handleMessage中处理

2.将得到的数据变成JSONArray,在转化成JSONObject,将jsonObject.getString()得到的响应值赋给属性值,添加到Newslist中

3.adapter通知更新

package com.news;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import com.google.gson.Gson;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{    private ListView lvNews;    private  NewsAdapter adapter;    private  List<News> newsList;    private static final String getURL = "http://192.168.253.1//test/getJson.php";    private   Handler getNewsHandler = new Handler() {       public  void  handleMessage(android.os.Message msg) {           String jsonData = (String) msg.obj;           System.out.println(jsonData);           //解析JSON数据           try {               /*JSONObject jsonObject = new JSONObject(jsonData);               JSONArray jsonArray = jsonObject.getJSONArray(String.valueOf(newsList));*/               Gson gson = new Gson();               //JSONArray jsonArray = new JSONArray(gson.toJson(jsonData));               JSONArray jsonArray = new JSONArray(jsonData);               if (jsonArray.length() == 0){                   System.out.println("this is null");               }               for (int i = 0; i < jsonArray.length(); i++) {                   JSONObject jsonObject = jsonArray.getJSONObject(i);                   String title = jsonObject.getString("title");                   String desc = jsonObject.getString("desc");                   String time = jsonObject.getString("time");                   String content_url = jsonObject.getString("content_url");                   String img_url = jsonObject.getString("img_url");                   System.out.println("title:" + title);                   newsList.add(new News(title, desc, time, content_url, img_url));                   adapter.notifyDataSetChanged();//通知更新               }           } catch (JSONException e) {               e.printStackTrace();           }       }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar);        setSupportActionBar(toolbar);        toolbar.setLogo(R.mipmap.ic_launcher);//设置图标        toolbar.setTitle("My Title");//标题        toolbar.setSubtitle("Sub title");//副标题        setSupportActionBar(toolbar);        lvNews = (ListView)findViewById(R.id.lvNews);        newsList = new ArrayList<>();        adapter = new NewsAdapter(this,newsList);        lvNews.setAdapter(adapter);        lvNews.setOnItemClickListener(this);        HttpUtils.getNewsJson(getURL,getNewsHandler);    }    public static String formatString(String s) {        if (s != null) {            s = s.replaceAll("\ufeff", "");        }        return s;    }    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        News news = newsList.get(position);        Intent intent = new Intent(this,BrowsNewsActivity.class);        intent.putExtra("content_url",news.getContent_url());        startActivity(intent);    }}

这里需要注意的几点

1.这里引用的是本机下的PHP文件,所以ip要是自己电脑的,可以通过cmd->ipconfig查看自己电脑的,在测试的时候如果用的是真机测试,要注意电脑和手机访问的是同一网络,通俗点说就是在一个无线。

2.在将收到的string message对象赋给JSONArray时,会报错,JSONException: Value <br of type java.lang.String cannot be converted to JSONArray,如果出现了这个问题先是检查一下自己的PHP文件中是否有错误,我就是PHP有错误引发这个,修改了就可以了,如果还是不行,有一个Gson,这个用于转化Java对象和JSON对象,通过tojson()方法可以转化为JSON数据,这样就不会出现上述错误


自此大致就结束了,当然别忘记在manifests中加入internet权限

0 0
原创粉丝点击