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

前面一篇说完来页面布局,总得来说页面在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对象

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 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


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

你可能感兴趣的:(Android)