ANdroid网易客户端

发布时间:2020-07-09 09:31:14 作者:Java大白
来源:网络 阅读:403

本博文主要记录一下做一个网易客户端的过程和感受。

  1. 这个APP采用的ListView这个控件,首先我们先在布局文件中定义一个ListView。


  2.     <ListView
            android:id="@+id/lv_news"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
           />

接下来,就是进行mainactivity代码片段的

package com.ytu.neteasy;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.Xml;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.p_w_picpath.SmartImageView;
import com.ytu.neteasy.entity.NewsInfo;

public class MainActivity extends Activity {
	private final int SUCCESS=0;
	private final int ERROR=1;
	ListView lv_News;
	List<NewsInfo> newsinfo;

	private static final String TAG = "MainActivity";
	private Handler handler=new Handler(){
		/**
		 * 接受消息
		 */
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SUCCESS://访问成功
				//给ListView列表绑定数据
				MyAdapter adapter=new MyAdapter();//创建一个适配器
				 newsinfo=(List<NewsInfo>) msg.obj;
				lv_News.setAdapter(adapter);
				break;
			case ERROR:
				Toast.makeText(MainActivity.this, "当前网络崩溃了", 0).show();
				break;
			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}

	private void init() {
		 lv_News=(ListView) findViewById(R.id.lv_news);
		
		//抓取新闻数据
		//getNewsFromNet();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				//返回时新闻集合
				List<NewsInfo> newsList=getNewsFromNet();
				//绑定数据
				Message msg=new Message();
				if(newsList!=null){
					msg.what=SUCCESS;
					msg.obj=newsList;
				}else{
					msg.what=ERROR;
				}
				handler.sendMessage(msg);
			}
		}).start();
		
	}

	/**
	 * 抓取网路数据的方法
	 * @return
	 */
	private List<NewsInfo> getNewsFromNet() {
		HttpClient client=null;
		try {
			//定义一个客户端
			client=new DefaultHttpClient();
			
			//定义get方法
			String uri="http://10.10.49.166:8080/Web025Server/new.xml";
			HttpGet get=new HttpGet(uri);
			
			//执行请求
			HttpResponse response=client.execute(get);
			int statuscode=response.getStatusLine().getStatusCode();
			if(statuscode==200){
				InputStream in=response.getEntity().getContent();
				List<NewsInfo> newsListInfo = getNewListFromInputStream(in);
				return newsListInfo;
			}else{
				Log.i(TAG, "请求失败"+statuscode);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(client!=null){
			client.getConnectionManager().shutdown();
			}
		}
		return null;
		
	}

	
	//解析xml文件
	/**
	 * 从流中解析新闻的集合
	 * @param in
	 * @return
	 * @throws Exception 
	 */
	private List<NewsInfo> getNewListFromInputStream(InputStream in) throws Exception{
		
			XmlPullParser parser = Xml.newPullParser();//创建一个pull解析器
			parser.setInput(in, "utf-8");//指定解析流和编码
			List<NewsInfo> newsListInfo=null;
			NewsInfo newinfo=null;
			int eventType=parser.getEventType();
			while(eventType!=XmlPullParser.END_DOCUMENT){//如果没有到达结尾处,继续循环
				String tagName=parser.getName();//获得节点名称
				switch (eventType) {
				case XmlPullParser.START_TAG://开始节点<news>
					if("news".equals(tagName)){
						newsListInfo=new ArrayList<NewsInfo>();
					}else if("new".equals(tagName)){
						newinfo=new NewsInfo();
					}else if("title".equals(tagName)){
						newinfo.setTitle(parser.nextText());
					}else if("detail".equals(tagName)){
						newinfo.setDetail(parser.nextText());
					}else if("comment".equals(tagName)){
						newinfo.setComment(Integer.valueOf(parser.next()));
					}else if("p_w_picpath".equals(tagName)){
						newinfo.setImageUrl(parser.nextText());
					}
					break;
				case XmlPullParser.END_TAG://结束节点</news>
					if("new".equals(tagName)){
					newsListInfo.add(newinfo);
					}
					break;
				default:
					break;
				}
				
				
				eventType=parser.next();//取下一个事件类型
				
			}
	
		return newsListInfo;
		
	}

	class MyAdapter extends BaseAdapter{

		/**
		 * 返回列表的总长度
		 */
		@Override
		public int getCount() {
			return newsinfo.size();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		/**
		 * 返回一个列表的子条目的
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view=null;
			if(convertView==null){
				LayoutInflater inflater=getLayoutInflater();
				view=inflater.inflate(R.layout.listview_item, null);
			}else{
				view=convertView;
			}
			
			SmartImageView smicon=(SmartImageView) view.findViewById(R.id.sm_listview_icon);
			TextView titleview=(TextView) view.findViewById(R.id.sm_listview_title);
			TextView detailview=(TextView) view.findViewById(R.id.sm_listview_detail);
			TextView commentview=(TextView) view.findViewById(R.id.sm_listview_comment);
			NewsInfo newInfo=newsinfo.get(position);
			
			smicon.setImageUrl(newInfo.getImageUrl());
			titleview.setText(newInfo.getTitle());
			detailview.setText(newInfo.getDetail());
			commentview.setText(newInfo.getComment()+"跟帖");
			return view;
		}
		
	}
	
}

接下来给大家展示listview的布局文件

<?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="wrap_content"
    android:padding="5dp"
    >
    <com.loopj.android.p_w_picpath.SmartImageView 
        android:id="@+id/sm_listview_icon"
        android:layout_width="100dp"
        android:layout_height="60dp"
        
        />
	<TextView 
	    android:id="@+id/sm_listview_title"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:singleLine="true"
	    android:text="这是标题"
	    android:layout_marginLeft="3dp"
	    android:layout_toRightOf="@id/sm_listview_icon"
	    android:textSize="17sp"
	    android:textColor="@android:color/black"
	    />
	<TextView 
	    android:id="@+id/sm_listview_detail"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="这是内容"
	    android:layout_toRightOf="@id/sm_listview_icon"
	    android:textSize="14sp"
	    android:textColor="@android:color/darker_gray"
	    android:layout_marginTop="3dp"
	    android:layout_below="@id/sm_listview_title"
	    android:layout_alignLeft="@id/sm_listview_title"
	    />
	<TextView 
	    android:id="@+id/sm_listview_comment"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	  
	    android:textSize="12sp"
	    android:textColor="#ff0000"
	    android:layout_alignParentRight="true"
	    android:layout_alignParentBottom="true"
	    />
</RelativeLayout>

这个项目主要用到了子线程,网络传输数据,处理输入流,以及XML文件的解析

服务器端的部分xml解析

<?xml version="1.0" encoding="UTF-8" ?>
<news>
	
	<new>
		<title>今日之声:北大雕塑被戴口罩</title>
		<detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
		<comment>681</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/2.jpg</p_w_picpath>
	</new>
	<new>
		<title>奥巴马见达赖是装蒜</title>
		<detail>外文局- 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
		<comment>1359</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/3.jpg</p_w_picpath>
	</new>
	<new>
		<title>轻松一刻: 我要沉迷学习不自拔</title>
		<detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
		<comment>10116</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/4.jpg</p_w_picpath>
	</new>
	<new>
		<title>男女那些事儿</title>
		<detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
		<comment>10339</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/5.jpg</p_w_picpath>
	</new>
	<new>
		<title>3Q大战宣判: 腾讯获赔500万</title>
		<detail>最高法驳回360上诉, 维持一审宣判.</detail>
		<comment>6427</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/1.jpg</p_w_picpath>
	</new>
	<new>
		<title>今日之声:北大雕塑被戴口罩</title>
		<detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
		<comment>681</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/2.jpg</p_w_picpath>
	</new>
	<new>
		<title>奥巴马见达赖是装蒜</title>
		<detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
		<comment>1359</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/3.jpg</p_w_picpath>
	</new>
	<new>
		<title>轻松一刻: 我要沉迷学习不自拔</title>
		<detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
		<comment>10116</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/4.jpg</p_w_picpath>
	</new>
	<new>
		<title>男女那些事儿</title>
		<detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
		<comment>10339</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/5.jpg</p_w_picpath>
	</new>
	<new>
		<title>3Q大战宣判: 腾讯获赔500万</title>
		<detail>最高法驳回360上诉, 维持一审宣判.</detail>
		<comment>6427</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/1.jpg</p_w_picpath>
	</new>
	<new>
		<title>今日之声:北大雕塑被戴口罩</title>
		<detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
		<comment>681</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/2.jpg</p_w_picpath>
	</new>
	<new>
		<title>奥巴马见达赖是装蒜</title>
		<detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
		<comment>1359</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/3.jpg</p_w_picpath>
	</new>
	<new>
		<title>轻松一刻: 我要沉迷学习不自拔</title>
		<detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
		<comment>10116</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/4.jpg</p_w_picpath>
	</new>
	<new>
		<title>男女那些事儿</title>
		<detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
		<comment>10339</comment>
		<p_w_picpath>http://10.10.49.166:8080/Web025Server/p_w_picpaths/5.jpg</p_w_picpath>
	</new>
</news>


推荐阅读:
  1. Android客户端网易考拉软件的路由设计方法
  2. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

网易客户端 android 网络 htt roi %d

上一篇:rocketmq集群部署(多master多slave异步)

下一篇:PHP错误处理函数debug_backtrace()怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》