神刀安全网

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

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Android+PHP+MySQL实现新闻列表(二)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址