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权限
- Android+PHP+MySQL实现新闻列表(二)
- Android+PHP+MySQL实现新闻列表(一)
- Android线程二、异步加载-新闻列表
- Android demo-->网易新闻风格的RSS新闻抓取项目(二) 新闻列表刷新、天气预报、设置页面滑动开关
- smarty与php实现新闻管理的代码(二)
- android listview实现新闻列表展示效果
- Android实现网易新闻客户端侧滑菜单(二)
- Android案例之新闻客户端和服务器端采用php+mysql实现,完全属于自己的新闻展示平台
- swift 新闻列表实现
- PHP创建RSS新闻列表
- Android实现的ListView-ListViewAdapter(新闻列表事例)
- Android中通过ListView的实现简单新闻列表
- Android中通过ListView的实现简单新闻列表
- php---mysql+ajax 无序列表(ul li)分页实现
- Android之类似网易新闻客户端首页新闻列表实现思路
- ExpandListview应用(实现二级列表和实现新闻分类)
- Fragment实现更新新闻列表功能(ListFragment)
- PHP静态新闻列表自动生成代码
- android6.0 Activity(三) Activity与WMS通信过程
- Linux下C开发实用小技术、好代码总结 —— 银行项目
- glibc 指导委员会解散声明
- unix domain socket进程凭据
- 孤儿进程与僵尸进程
- Android+PHP+MySQL实现新闻列表(二)
- Android 7.0正式版来了!看看这五个新东西
- ORACLE --- 常用命令和语句
- 进程间通信之共享内存
- java网络编程基于TCP的多客户端连接服务器
- Struts学习总结(九)---使用Struts2实现用户信息的CRUD操作(三:修改操作)
- springmvc生成Excel并且返回给客户端
- 块级元素和块元素,行内级元素和行内元素 ,置换元素与非置换元素 (img是行内元素,但是可以设置高度,因为他本身具有一定的高度和宽度,是置换元素,所以可以设置高度和宽度)
- java concurrent 包的基石 volatile 和 锁的原理分析