Android案例《新闻客户端》

  新闻客户端运用了多个开源框,此次博文就为大家讲解两个比较热门的开源项目AsyncHttpClient和SmartImageView的概述和使用。 

1.AsyncHttpClient的使用

在Android开发中,发送、处理HTTP请求十分常见,如果每次与服务器进行数据交互都需要去开启一个子线程,这样是非常麻烦的。为了解决这个问题,一些开发者开发出了开源项目——AsyncHttpClient。

https://github.com/loopj/android-async-http

http://hc.apache.org/download.cgi

AsyncHttpClient是对HttpClient的再次包装。AsyncHttpClient的特点有,发送异步HTTP请求、HTTP请求发生在UI线程之外、内部采用了线程池来处理并发请求,而且它使用起来比HttpClient更加简便。•

2. SmartImageView的使用

市面上一些常见软件,例如手机QQ、天猫、京东商场等,都加载了大量网络上的图片。用Android自带的API实现这一功能十分麻烦而且耗时。为此,编程爱好者开发了一个开源项目——SmartImageView。

https://github.com/loopj/android-smart-image-view

开源项目SmartImageView的出现主要是为了加速从网络上加载图片,它继承自ImageView类,支持根据URL地址加载图片、支持异步加载图片、支持图片缓存等。

1.创建主界面:

    <span style="font-size:18px;"><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></span>  

2.创建ListView中的Item布局

    <span style="font-size:18px;"><?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>  
    </span>  

3.创建newsInfo类

<span style="font-size:18px;">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;  
    }  
}</span> 

4.创建ListView适配器NewsAdapter

    <span style="font-size:18px;">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()+"");//传递的为int类型,所以加上空格转换为了字符串类型  
            return view;  
        }  
        class viewHolder{//添加类,封装需要查找的控件  
            TextView tv_title;  
            TextView tv_description;  
            TextView  tv_type;  
            SmartImageView siv;  

        }  
    }</span>  

5.最后编写主函数MainActivity,代码如下:

    <span style="font-size:18px;">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);  
            setContentView(R.layout.activity_main);  
            lv_news=(ListView)findViewById(R.id.lv_news);  
            loading=(LinearLayout)findViewById(R.id.loading);  
            fillData2();  
        }  
        private void fillData2() {  
           AsyncHttpClient client=new AsyncHttpClient();  
            client.get("http://10.51.17.215:8080/NewsInfo.json",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.setVisibility(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) {  

                }  
            });  
        }  

    }</span>  

多运用框架可以节省开发时间与成本,应多运用开源框架去做Android项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值