`

android客户端连接人人网之二----获取朋友信息

 
阅读更多
1,http请求,将paramList发送到http://api.renren.com/restserver.do进行post请求。
同时得到HttpResponse响应,判断响应代码是否为200,为200表示成功。解析JSON数据为相关对象。
	private String sendRequest() {
		String returnValue = "0";
		httpClient = new DefaultHttpClient();
		try {
			HttpPost httpPost = new HttpPost(
					"http://api.renren.com/restserver.do");
			httpPost.setEntity(new UrlEncodedFormEntity(paramList, HTTP.UTF_8));// 添加请求参数到请求对象

			HttpResponse httpResponse = httpClient.execute(httpPost);
			if (httpResponse.getStatusLine().getStatusCode() == 200) { // 为200表示执行成功
				strResult = EntityUtils.toString(httpResponse.getEntity()); // 得到返回数据(为JSON数据)
				Log.i("RenrenFriendsActivity", "strResult:" + strResult);
				if (!strResult.contains("error_code")) {
					renrenList = RenrenUtil.parseRenrenFromJson(strResult); // 解析JSON数据为相应对象
					returnValue = "1"; // 定义返回标志
				}
			}
		} catch (ClientProtocolException e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (IOException e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		} catch (Exception e) {
			strResult = e.getMessage().toString();
			e.printStackTrace();
		}
		return returnValue;
	}

2,解析Json:
	/**
	 * 解析JSON数据为人人对象
	 * 
	 * @param renrenJsonData
	 * @return
	 */
	public static List<Renren> parseRenrenFromJson(String renrenJsonData) {
		List<Renren> renrenList = new ArrayList<Renren>();
		try {
			JSONArray jsonArray = new JSONArray(renrenJsonData);
			int length = jsonArray.length();
			for (int i = 0; i < length; ++i) {
				JSONObject jsonObject = jsonArray.getJSONObject(i);
				Renren renren = new Renren();
				renren.setId(jsonObject.getString("id"));
				renren.setName(jsonObject.getString("name"));
				renren.setHeadurl(jsonObject.getString("headurl"));
				renrenList.add(renren);
			}
			return renrenList;
		} catch (JSONException e) {
		}
		return null;
	}


写一个RenRen bean用来保存信息;
public class Renren {
	protected String id;
	protected String name;
	protected String headurl;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getHeadurl() {
		return headurl;
	}

	public void setHeadurl(String headurl) {
		this.headurl = headurl;
	}

}

3,使用AsyncTask来异步网络连接和查询:
FriendsTask task = new FriendsTask();
		task.execute("10");

FriendsTask的代码如下:
class FriendsTask extends AsyncTask<String, Integer, String> {
		@Override
		protected String doInBackground(String... params) {
			Log.i("FriendsTask", "----doInBackground----");
			getParams();
			return sendRequest();
		}

		@Override
		protected void onCancelled() {
			Log.i("FriendsTask", "----onCancelled----");
			super.onCancelled();
		}

		@Override
		protected void onPostExecute(String result) {
			Log.i("FriendsTask", "----onPostExecute----");
			Log.i("FriendsTask", "result:" + result);
			// message.setText(result);
			pDialog.dismiss();
			if (result.equals("1")) {
				mHandler.sendEmptyMessage(SUCCESS);
			} else {
				mHandler.sendEmptyMessage(FAILURE);
			}
		}

		@Override
		protected void onPreExecute() {
			Log.i("FriendsTask", "----onPreExecute----");
			// 任务启动,可以在这里显示一个对话框,这里简单处理
			pDialog = ProgressDialog.show(RenrenFriendsActivity.this,
					"Importing", "importing...");
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			// 更新进度
			// message.setText(values[0]);
			Log.i("FriendsTask", "---onProgressUpdate----");
		}
	}


4,使用一个adapter来适配listview,由于返回头像的时候只返回的是url,所以,通过新开一个线程来异步加载头像图片。
Adapter类如下:
class FriendsAdapater extends BaseAdapter {
		private AsyncImageLoader asyncImageLoader = new AsyncImageLoader(); // 异步获取图片
		TextView userName;
		ImageView userImage;

		public int getCount() {
			return renrenList == null ? 0 : renrenList.size();
		}

		public Object getItem(int position) {
			return renrenList == null ? null : renrenList.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {

			convertView = LayoutInflater.from(getApplicationContext()).inflate(
					R.layout.renren_friend_item, null);
			userName = (TextView) convertView.findViewById(R.id.username);
			userImage = (ImageView) convertView.findViewById(R.id.userimage);

			Renren renren = renrenList.get(position);
			if (renren != null) {
				convertView.setTag(renren.getId());
				userImage.setTag(renren.getHeadurl());
				userName.setText(renren.getName());

				// 异步加载图片并显示
				Drawable cachedImage = asyncImageLoader.loadDrawable(renren,
						new ImageCallback() {
							public void imageLoaded(Drawable imageDrawable,
									String imageUrl) {
								ImageView imageView = (ImageView) friendsListView
										.findViewWithTag(imageUrl);
								if (imageView != null) {
									imageView.setImageDrawable(imageDrawable);
								}
							}
						});

				if (cachedImage != null) {
					userImage.setImageDrawable(cachedImage);
				} else {// 如果没有图片,就以一个载入的图片代替显示
					userImage.setImageResource(R.drawable.avatar_default);
				}
			}
			return convertView;
		}
	}


异步加载图片的类AsyncImageLoader如下:
public class AsyncImageLoader {

	private HashMap<String, SoftReference<Drawable>> imageCache; // 缓存图片

	public AsyncImageLoader() {
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}

	public Drawable loadDrawable(final Renren renren,
			final ImageCallback imageCallback) {
		final String imageId = renren.getId();
		final String imageURL = renren.getHeadurl();

		// 判断缓存中是否已经存在图片,如果存在则直接返回
		if (imageCache.containsKey(imageId)) {
			SoftReference<Drawable> softReference = imageCache.get(imageId);
			Drawable drawable = softReference.get();
			if (drawable != null) {
				return drawable;
			}
		}

		final Handler handler = new Handler() {
			public void handleMessage(Message message) {
				imageCallback.imageLoaded((Drawable) message.obj, imageURL);
			}
		};

		// 开辟一个新线程去下载图片,并用Handler去更新UI
		new Thread() {
			@Override
			public void run() {
				Drawable drawable = loadImageFromUrl(imageURL);
				imageCache.put(imageURL, new SoftReference<Drawable>(drawable));
				Message message = handler.obtainMessage(0, drawable);
				handler.sendMessage(message);
			}
		}.start();
		return null;
	}

	// 从URL下载图片
	public static Drawable loadImageFromUrl(String url) {
		URL m;
		InputStream i = null;
		try {
			m = new URL(url);
			i = (InputStream) m.getContent();
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Drawable d = Drawable.createFromStream(i, "src");
		return d;
	}

	// 回调接口
	public interface ImageCallback {
		// 回调函数
		public void imageLoaded(Drawable imageDrawable, String imageUrl);
	}
}


好了,这样你就可以从人人网获取好友信息了。
更多接口请查看:
http://wiki.dev.renren.com/wiki/API#.E5.9F.BA.E7.A1.80API
分享到:
评论

相关推荐

    Android 简单的人人网客户端源码.rar

    2. **网络请求处理**:Android客户端需要与人人网服务器进行通信,这通常通过HTTP或HTTPS协议实现。可以使用HttpURLConnection或者第三方库如OkHttp、Retrofit来发送网络请求。登录、获取好友信息、发布状态等操作都...

    简单的人人网客户端源码.zip

    在这个案例中,该客户端源码的目标是连接人人网,一个曾经在中国广受欢迎的社交网络平台。 一、Android客户端开发基础 Android客户端开发主要依赖于Java或Kotlin语言,以及Android SDK。开发者通过编写代码来创建...

    Android 人人测试端

    【Android 人人测试端】是一个专为Android平台设计的应用程序,它提供了与人人网(原校内网)的全面互动功能。这个客户端是完整的,能够正常运行,让用户在移动设备上方便地浏览好友信息、发布状态、查看动态,以及...

    [安卓源码]高仿人人网客户端.zip项目安卓应用源码下载

    这篇内容将深入探讨基于Java和Apache技术栈的安卓应用源码,以高仿人人网客户端为例,适用于学生毕业设计、个人学习和公司项目的技术参考。源码下载后,我们可以从中获取丰富的知识,理解Android应用开发的核心原理...

    简单的人人网客户端

    在这个名为"简单的人人网客户端"的项目中,我们主要探讨的是如何利用Android编程语言来开发一个连接人人网(Renren.com)的移动应用程序。人人网,作为中国的一个社交媒体平台,曾经广受欢迎,而这个客户端就是为了...

    Android推送实现方案探讨

    - **社交网络服务(SNS)信息推送**:例如QQ空间、人人网、微博、天涯论坛等社交平台,利用推送技术及时通知用户有关动态更新,有助于增强用户粘性和活跃度。 #### 客户端/服务器通信方式 在客户端与服务器之间的...

    基于Android的高速数据传输设计与实现.pdf

    - 集成社交平台一键登录:通过集成QQ、人人网、新浪微博等社交平台的SDK或API,实现一键登录功能。 - 自定义名片功能:用户可以利用多种工具定制个性化名片,包括手写、图片、二维码、语音和文本等。 - 名片互换:...

    浅析国内社交网络发展

    这一时期出现了诸如人人网、开心网等SNS(Social Networking Service)社交网站,标志着中国社交网络开始向更为多元化的方向发展。 3. **成熟期**:近年来,随着移动互联网技术的成熟,社交网络迎来了全新的发展阶段...

Global site tag (gtag.js) - Google Analytics