Android---SmartImageView和AsyncHttpClient的应用之《新闻客户端》案例
来源:互联网 发布:apache kylin 2.0安装 编辑:程序博客网 时间:2024/06/06 19:38
市面上一些常见软件,例如手机QQ、天猫、京东商场等,都加载了大量网络上的图
片。用Android自带的API实现这一功能十分麻烦而且耗时。为此,编程爱好者开发了一
个开源项目——SmartImageView。
SmartImageView的出现主要是为了加速从网络上加载图片,它继承自ImageView类,支
持根据URL地址加载图片、支持异步加载图片、支持图片缓存等。
https://github.com/loopj/android-smart-image-view
在Android开发中,发送、处理HTTP请求十分常见,如果每次与服务器进行数据交互都
需要去开启一个子线程,这样是非常麻烦的。为了解决这个问题,一些开发者开发出了
开源项目——AsyncHttpClient。
–https://github.com/loopj/android-async-http
–http://hc.apache.org/download.cgi
–AsyncHttpClient是对HttpClient的再次包装。AsyncHttpClient的特点有,发送异
步HTTP请求、HTTP请求发生在UI线程之外、内部采用了线程池来处理并发请求,而且
它使用起来比HttpClient更加简便。
通过案例演示AsyncHttpClient和SmartImageView的综合使用。
首先,要配置Tomcat服务器。http://tomcat.apache.org/官网下载通过startup.bat启动服
务器。将JSON文件和images文件夹复制到webapps/Root文件夹下。
其次,创建json文件,提供一个json在线编辑器http://www.qqe2.com/进行在线编辑。
下面开始创建程序。
用户界面的设计如下:
主布局activity_main.xml文件 布局news_item.xml文件
添加jar包。切换到Project,找到libs添加所需要的jar包。
添加gson包。
下面开始编写程序代码。
1.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" tools:context=".MainActivity" android:orientation="vertical"> <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" /> </FrameLayout></LinearLayout>2.news_item.xml文件如下所示:
<?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:scaleType="centerCrop" android:src="@mipmap/ic_launcher" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"></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>
Item布局 "新闻客户端"界面
3.编写界面交互代码
MainActivity.java代码:
package bzu.edu.cn.news;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.io.UnsupportedEncodingException;import java.util.List;import bzu.edu.cn.news.Tools.JsonParse;public class MainActivity extends AppCompatActivity { private ListView lv_news; private LinearLayout loading; private List<NewsInfo> newsInfos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lv_news=(ListView)findViewById(R.id.lv_news); loading=(LinearLayout)findViewById(R.id.loading); fillData2(); //setContentView(R.layout.activity_main); } private void fillData2() { AsyncHttpClient client=new AsyncHttpClient(); client.get("http://10.16.11.203:8080/NewsInfo.json"(自己电脑的ip地址),new AsyncHttpResponseHandler(){ @Override public void onSuccess(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes) { //请求成功 try{ String json=new String (bytes,"utf-8"); newsInfos= JsonParse.getNewsInfo(json); if(newsInfos==null){ Toast.makeText(MainActivity.this,"解析失败",Toast.LENGTH_SHORT).show(); }else{ loading.setVerticalGravity(View.INVISIBLE); lv_news.setAdapter(new NewsAdapter(MainActivity.this,newsInfos)); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } @Override public void onFailure(int i, cz.msebera.android.httpclient.Header[] headers, byte[] bytes, Throwable throwable) { } }); }}4.创建NewsInfo类
package bzu.edu.cn.news;/** * Created by 筱倩 on 2017/5/17. */public class NewsInfo { private String iconPath; private String title; private String description; private int type; private long comment; public NewsInfo(String iconPath, String title, String description, int type, long comment) { this.iconPath = iconPath; this.title = title; this.description = description; this.type = type; this.comment = comment; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } 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 getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getIconPath() { return iconPath; } public void setIconPath(String iconPath) { this.iconPath = iconPath; }}5.添加ListView适配器NewsAdapter
package bzu.edu.cn.news;import android.content.Context;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 java.util.List;public class NewsAdapter extends ArrayAdapter<NewsInfo>{ public NewsAdapter(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);//传递position,获取当前位置对应的newsinfo新闻信息 View view=null; viewHolder viewHolder; if(convertView==null){ //判断convertView中是否加载了布局,有没有缓存。为空说明没有缓存 view=LayoutInflater.from(getContext()).inflate(R.layout.news_item,null); viewHolder=new viewHolder(); viewHolder.siv= (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.tv_title.setText(newsinfo.getTitle());//传递题目 viewHolder.tv_description.setText(newsinfo.getDescription()); viewHolder.tv_type.setText(newsinfo.getType()); return view; } class viewHolder{//添加类,封装需要查找的控件 TextView tv_title; TextView tv_description; TextView tv_type; SmartImageView siv; }}6.创建工具类Jsonparse负责解析JSON数据
package bzu.edu.cn.news.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.news.NewsInfo;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(); //把获取到的信息集合存到newsInfo中 List<NewsInfo> newsInfos=gson.fromJson(json,listType); return newsInfos; }}7.添加权限
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>这样,代码基本完成,运行程序如下所示:
最后,需要修改图片。在Tomcat中找到NewsInfo.json,修改IP地址,就可以实现完整的案例了。
最后这张是我借用的别人的案例图片。自己的那个图片还没有显示出来,最后修改ip时,不能修改,一时还没有想好办法。
- Android---SmartImageView和AsyncHttpClient的应用之《新闻客户端》案例
- AsyncHttpClient和SmartImageView的使用及案例(新闻客户端)
- Android-----AsyncHttpClient和SmartImageView的概述和使用---案例《新闻客户端》
- Android中综合使用AsyncHttpClient和SmartImageView编写新闻客户端的案例
- 实验:android案例——新闻客户端(使用开源项目AsyncHttpClient和SmartImageView)
- 新闻客户端(AsyncHttpClient和SmartImageView的综合使用)
- AsyncHttpClient和SmartImageView的综合使用--新闻客户端
- 新闻客户端(AsyncHttpClient和SmartImageView的综合使用
- AsyncHttpClient和SmartImageView的综合使用--新闻客户端
- 新闻客户端——SmartImageView——AsyncHttpClient
- 新闻客户端案例——(AsycHttpClient,SmartImageView,JSON)
- Android案例之新闻客户端和服务器端采用php+mysql实现,完全属于自己的新闻展示平台
- Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台
- Android 新闻客户端案例
- Android案例《新闻客户端》
- Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台
- Android学习之路——网络编程学习——新闻客户端(AsyncHttpClient)
- Android案例—新闻客户端
- 【Linux】alias及设置
- 轻量级框架开发
- tf-Mnist手写字体识别
- js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 # )
- EOJ 3261 分词 dp+字典树
- Android---SmartImageView和AsyncHttpClient的应用之《新闻客户端》案例
- JDK8 JVM 简单堆分配实验
- js插件开发规范
- IE下跨域出现No Transport
- 20170524-SQL数据输出转换,ResultSet,method
- 二叉查找树的判断
- STM32高级教程之USB HID双向数据传输
- 初始
- Android的IPC机制