网络编程之开源项目和JSON解析技术的使用——简易新闻客户端
来源:互联网 发布:ubuntu分区工具 编辑:程序博客网 时间:2024/05/20 10:11
此案例中使用了开源项目AsyncHttpClient和SmartImageView,以及JSON解析技术的使用。实现获取服务器的Json文件并将其解析出来捆绑显示到ListView上的功能。
1、首先创建一个应用程序,将我们需要的包导进lib文件夹下。
2、配置Tomcat服务器,将JSON文件和images文件夹放在webapps/Root文件夹下,然后在bin文件夹下,通过startup.bat开启服务器。
JSON文件内容如下:(注意“icon”的地址要根据自己电脑的地址修改)
3、打开浏览器输入网址http://192.168.1.109:8080/NewsInfo.json(此地址要与自己的电脑ip地址一致),如果显示Json文件内容则开启成功。
4、设计用户交互界面。
程序对应的布局文件(activity_main.xml)代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/loading" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:visibility="invisible"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="正在加载信息..." /> </LinearLayout> <ListView android:id="@+id/lv_news" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="3dp" /> </FrameLayout></LinearLayout>
5、创建ListView Item的布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="65dp"> <com.loopj.android.image.SmartImageView android:id="@+id/siv_icon" android:layout_width="80dp" android:layout_height="60dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:scaleType="centerCrop" android:src="@mipmap/ic_launcher"></com.loopj.android.image.SmartImageView> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginTop="10dp" android:layout_toRightOf="@id/siv_icon" android:ellipsize="end" android:maxLength="20" android:singleLine="true" android:text="我是标题" android:textColor="#000000" android:textSize="18sp" /> <TextView android:id="@+id/tv_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_title" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:layout_toRightOf="@id/siv_icon" android:ellipsize="end" android:maxLength="16" android:maxLines="1" android:text="我是描述" android:textColor="#99000000" android:textSize="14sp" /> <TextView android:id="@+id/tv_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="5dp" android:layout_marginRight="10dp" android:text="评论" android:textColor="#99000000" android:textSize="12sp" /></RelativeLayout>
6、创建NewsInfo类,需注意的是此类中的属性要与JSON文件中的相对应。
package bzu.edu.cn.imagebrowser.entity;/** * Created by yn on 2017/5/19. */public class NewsInfo { private String icon; private String title; private String content; private int type; private long comment; public long getComment() { return comment; } public void setComment(long comment) { this.comment = comment; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getContent() { return content; } public void setContent(String description) { this.content = content; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; }}
7、自定义一个ListView适配器,代码如下:
package bzu.edu.cn.imagebrowser.adapter;import android.content.Context;import android.graphics.Color;import android.support.annotation.NonNull;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.TextView;import com.loopj.android.image.SmartImageView;import org.w3c.dom.Text;import java.util.List;import bzu.edu.cn.imagebrowser.R;import bzu.edu.cn.imagebrowser.entity.NewsInfo;/** * Created by yn on 2017/5/19. */public class MyAdapter extends ArrayAdapter<NewsInfo> { public MyAdapter(Context context, List<NewsInfo> objects) { super(context, R.layout.news_item, objects); } @NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { NewsInfo newsInfo = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(R.layout.news_item, null); viewHolder = new ViewHolder(); viewHolder.siv_icon = (SmartImageView) view.findViewById(R.id.siv_icon); viewHolder.tv_title = (TextView) view.findViewById(R.id.tv_title); viewHolder.tv_description = (TextView) view.findViewById(R.id.tv_description); viewHolder.tv_type = (TextView) view.findViewById(R.id.tv_type); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.siv_icon.setImageUrl(newsInfo.getIcon()); viewHolder.tv_title.setText(newsInfo.getTitle()); viewHolder.tv_description.setText(newsInfo.getContent()); int type = newsInfo.getType(); switch (type) { case 1: viewHolder.tv_type.setText("评论:" + newsInfo.getComment()); break; case 2: viewHolder.tv_type.setTextColor(Color.RED); viewHolder.tv_type.setText("专题"); break; case 3: viewHolder.tv_type.setTextColor(Color.BLUE); viewHolder.tv_type.setText("LIVE"); break; } return view; } class ViewHolder { SmartImageView siv_icon; TextView tv_title; TextView tv_description; TextView tv_type; }}
8、创建工具类解析JSON文件,代码如下:
package bzu.edu.cn.imagebrowser.tools;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import java.lang.reflect.Type;import java.util.List;import bzu.edu.cn.imagebrowser.entity.NewsInfo;/** * Created by yn on 2017/5/19. */public class JsonParse { public static List<NewsInfo> getNewsInfo(String json) { //使用gson库解析JSON数据 Gson gson = new Gson(); //创建一个TypeToken的匿名子类对象,并调用对象的getType()方法 Type listType = new TypeToken<List<NewsInfo>>() { }.getType(); //把获取的信息集合存到newsInfos中 List<NewsInfo> newsInfos = gson.fromJson(json, listType); return newsInfos; }}
9、编写界面交互代码(MainActivity),实现使用AysncHttpClient获取服务器上的JSON文件,并调用工具类JsonParse的getNewsInfo()方法解析JSON文件得到NewsInfo对象的List集合。
package bzu.edu.cn.imagebrowser;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import java.util.List;import bzu.edu.cn.imagebrowser.adapter.MyAdapter;import bzu.edu.cn.imagebrowser.entity.NewsInfo;import bzu.edu.cn.imagebrowser.tools.JsonParse;public class Main2Activity extends AppCompatActivity { private ListView listView; private LinearLayout loading; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); listView = (ListView) findViewById(R.id.lv_news); loading = (LinearLayout) findViewById(R.id.loading); fillData(); } //使用AsyncHttpClient访问网络 private void fillData() { //创建AsyncHttpClient实例 AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); //使用GET方法请求 asyncHttpClient.get("http://10.61.15.146:8080/NewsInfo.json", new AsyncHttpResponseHandler() { @Override public void onSuccess(int i, org.apache.http.Header[] headers, byte[] bytes) { //请求成功 String json; try { json = new String(bytes, "utf-8"); List<NewsInfo> newsInfos = JsonParse.getNewsInfo(json); if (newsInfos == null) { Toast.makeText(Main2Activity.this, "解析失败", Toast.LENGTH_LONG).show(); } else { //更新界面 loading.setVisibility(View.INVISIBLE); listView.setAdapter(new MyAdapter(Main2Activity.this, newsInfos)); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(int i, org.apache.http.Header[] headers, byte[] bytes, Throwable throwable) { //请求失败 Toast.makeText(Main2Activity.this, "解析失败", Toast.LENGTH_LONG).show(); } }); }}
10、添加权限
本案例需要访问网络因此需要在清单文件里配置相应的权限。具体如下所示:
<uses-permission android:name="android.permission.INTERNET" />
运行程序查看新闻
阅读全文
0 0
- 网络编程之开源项目和JSON解析技术的使用——简易新闻客户端
- android开发笔记之网络编程—简易新闻客户端
- Android---网络编程之简易新闻客户端
- 网络编程小案例之简易新闻客户端
- 网络编程案例简易新闻客户端
- 实验:android案例——新闻客户端(使用开源项目AsyncHttpClient和SmartImageView)
- C++网络编程之——简易的服务器端与客户端
- 简单新闻客户端(3)---网络数据请求,json包解析
- Android学习之路——网络编程学习——新闻客户端(AsyncHttpClient)
- 网络编程之Json解析方式与Gson方式解析两兄弟的行为和特点
- 网络编程---模仿新闻客户端
- Android 网络编程之 XML 和 JSON 解析
- 安卓开发之简易新闻客户端
- iOS网络编程3—JSON解析
- 网络请求——新闻客户端的一个Demo
- Android网络编程之JSON文件的构建和解析 学习笔记
- JSON服务器的使用和客户端的解析
- JSON服务器的使用和客户端的解析
- (100)数组节点
- 七、多线程(未完.待更)
- Android17
- Angular的一些坑
- C++实验6——字符串操作
- 网络编程之开源项目和JSON解析技术的使用——简易新闻客户端
- socket系列(一)——socket实现推送
- android18
- css之元素的显示方式
- tensorflow实现对图片的读取
- 正则语言引擎:一个简单LEX和YACC结合运用的实例
- spark 2.1 TaskResult
- postfix
- android18