分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
新浪微博客户端开发之授权登录+获取微博列表
闲篇:
最近实在是乱得不行,至于怎么乱我也不知该怎么说,那么久没发博客就证明了这点,一般如果小巫有做详尽的计划,并把时间投入到上面的话,我是可以用最短的时间里把新浪微博客户端给整出来的,但现在进度很慢,我越来越不像个称职的程序猿,因为现在的生活已经不再是代码,更多的是想多享受跟朋友们在一起的快乐。这些话也不多说了,关于这个项目,其实我也头痛了一整子,我很久之前就买了一本李宁的Android应用开发实战,里面很大篇幅就是介绍这个客户端的开发,因为一开始我是比较迷惑的,迷惑他到底有没有使用新浪开发平台提供的SDK,然而整个授权过程到获取微博的各种数据又是怎样的?我还在考虑我要做成一个怎样的,是否只是单纯的模仿呢?反正种种疑虑,一阵子找不到北了。后来我花时间研究了他的代码,慢慢的也找了了一些门道,明白了他从是怎么把整个客户端搭建起来的,他没有使用新浪给我们提供的SDK,而似乎是把SDK的实现给翻出来了,因为SDK仅仅提供了获取微博数据的封装,开发者就只需调用API,知道怎么传参数就行了,所以很多高手是不会直接使用新浪提供的Android SDK。要我从头到尾开发,把所有业务逻辑实现,我实在不行,所以会直接参考Android应用开发实战所提供的代码,把整个新浪微博客户端开发出来给大家看看,这也算是小巫的一个提升,与大家共同进步。
正篇:
本篇博客呢,主要介绍如何进行授权认证,如何获取微博列表,因为代码比较多,我不会全部都能贴出来,整个客户端也没有开发完毕,我也是实现一个功能,然后整理博客发表出来,如果想要项目源码的,可以直接找我,我的
QQ:659982592, 如果我在的话,我会尽快答复你的。
先来看看本篇博客想要实现的效果图:
看到以上的效果,我想很多人都想知道是如何实现的,不急,我们慢慢来看,这个可不是能一口吃掉的螃蟹。
我先简单介绍一下以上效果图的业务流程,启动程序后,首先需要获取用户授权,假如已经授权过了,就不会出现提示用户输入登录的界面,授权成功后,直接获取微博数据,显示到微博列表当中。整个流程其实也蛮简单的,现在我们来看看代码。
/Wwj_sina_weibo/src/com/wwj/sina/weibo/
WeiboMain.java
这个类用来切换底部标签的,比较高的版本已经不推荐用这种方法实现,不过没关系,反正高版本兼容低版本。
package com.wwj.sina.weibo;import android.app.TabActivity;import android.content.Intent;import android.os.Bundle;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TabHost;import android.widget.TabHost.TabSpec;/** * 主Activity * @author wwj * 通过点击RadioGroup下的RadioButton来切换不同界面 */@SuppressWarnings("deprecation")public class WeiboMain extends TabActivity { public TabHost mTabhost; public static final String TAB_HOME = "TabHome"; public static final String TAB_MSG = "TabMsg"; public static final String TAB_SELF = "TabSelfInfo"; public static final String TAB_DISCOVE = "TabDiscove"; public static final String TAB_MORE = "TabMore"; RadioButton radio_button0; public static RadioGroup indexGroup; @SuppressWarnings("static-access") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置无标题 requestWindowFeature(getWindow().FEATURE_NO_TITLE); this.setContentView(R.layout.tabbar); radio_button0 = (RadioButton) this.findViewById(R.id.tabbar_home); radio_button0.setChecked(true); // 设置首页按钮默认是按下状态 mTabhost = (TabHost) findViewById(android.R.id.tabhost); // 获取TabHost // 设定标签、制定一个标签作为选项卡指示符 TabSpec tabSpec1 = mTabhost.newTabSpec(TAB_HOME).setIndicator(TAB_HOME); // 指定一个加载activity的Intent对象作为选项卡内容 tabSpec1.setContent(new Intent(WeiboMain.this, HomeActivity.class)); mTabhost.addTab(tabSpec1); // 添加第一个子页 TabSpec tabSpec2 = mTabhost.newTabSpec(TAB_MSG).setIndicator(TAB_MSG); tabSpec2.setContent(new Intent(WeiboMain.this, MessageActivity.class)); mTabhost.addTab(tabSpec2); // 添加第二个子页 TabSpec tabSpec3 = mTabhost.newTabSpec(TAB_SELF).setIndicator(TAB_SELF); tabSpec3.setContent(new Intent(WeiboMain.this, SelfInfoActivity.class)); mTabhost.addTab(tabSpec3); // 添加第三个子页 TabSpec tabSpec4 = mTabhost.newTabSpec(TAB_DISCOVE).setIndicator( TAB_DISCOVE); tabSpec4.setContent(new Intent(WeiboMain.this, DiscoveActivity.class)); mTabhost.addTab(tabSpec4); // 添加第四个子页 TabSpec tabSpec5 = mTabhost.newTabSpec(TAB_MORE).setIndicator(TAB_MORE); tabSpec5.setContent(new Intent(WeiboMain.this, MoreActivity.class)); mTabhost.addTab(tabSpec5); // 添加第一个子页 this.indexGroup = (RadioGroup) this.findViewById(R.id.main_radio); // 实现RadioGroup的子选项点击监听 indexGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.tabbar_home: // 首页 mTabhost.setCurrentTabByTag(TAB_HOME); break; case R.id.tabbar_message:// 信息 mTabhost.setCurrentTabByTag(TAB_MSG); break; case R.id.tabbar_me: // 个人资料 mTabhost.setCurrentTabByTag(TAB_SELF); break; case R.id.tabbar_discove: // 发现 mTabhost.setCurrentTabByTag(TAB_DISCOVE); break; case R.id.tabbar_more: // 更多 mTabhost.setCurrentTabByTag(TAB_MORE); } } }); }}
/Wwj_sina_weibo/src/com/wwj/sina/weibo/
HomeActivity.java
这个Activity就是显示微博列表的界面,代码还不完善,这里只看关键点。
package com.wwj.sina.weibo;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.MenuItem;import android.view.MenuItem.OnMenuItemClickListener;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;import com.weibo.net.Weibo;import com.wwj.sina.weibo.adapter.WeiboListAdapter;import com.wwj.sina.weibo.interfaces.Const;import com.wwj.sina.weibo.library.StorageManager;import com.wwj.sina.weibo.library.WeiboData;import com.wwj.sina.weibo.library.WeiboManager;import com.wwj.sina.weibo.listener.impl.StatusRequestListenerImpl;import com.wwj.sina.weibo.object.Status;import com.wwj.sina.weibo.object.User;import com.wwj.sina.weibo.util.Tools;import com.wwj.sina.weibo.view.PullToRefreshListView;import com.wwj.sina.weibo.view.PullToRefreshListView.OnRefreshListener;import com.wwj.sina.weibo.workqueue.DoneAndProcess;import com.wwj.sina.weibo.workqueue.WorkQueueMonitor;import com.wwj.sina.weibo.workqueue.task.ParentTask;import com.wwj.sina.weibo.workqueue.task.PullFileTask;/** * 主界面 * * @author wwj 用于显示公共微博 */public class HomeActivity extends Activity implements Const, OnClickListener, OnItemClickListener, OnItemLongClickListener, OnMenuItemClickListener, DoneAndProcess { public PullToRefreshListView weiboListView; // 自定义ListView private Weibo weibo; // 微博对象 public HomeData homeData; // 主界面数据 public TextView username; // 用户名,显示在标题栏 public Button btn_post_weibo; // 发布微博 public Button btn_reload; // 加载新微博 private LinearLayout linearLayoutHome; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { }; }; // 微博列表主界面的数据 public static class HomeData { public WeiboListAdapter weiboListAdapter; public WorkQueueMonitor imageWorkQueueMonitor; public WorkQueueMonitor taskWorkQueueMonitor; public User user; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); loadView(); getWindow().setBackgroundDrawable(null); weibo = Tools.getWeibo(this); // 获取微博对象 homeData = (HomeData) getLastNonConfigurationInstance(); if (homeData == null) { homeData = new HomeData(); if (!(weibo == null || !weibo.isSessionValid())) { @SuppressWarnings("unchecked") List<Status> statuses = StorageManager.loadList(this, Const.HOME); if (statuses == null) { statuses = WeiboManager.getHomeTimeline(this); } homeData.weiboListAdapter = WeiboData.loadWeiboListData(this, Const.HOME, weiboListView, statuses); } } } @Override protected void onResume() { super.onResume(); } @Override public Object onRetainNonConfigurationInstance() { return homeData; } // 加载视图 private void loadView() { weiboListView = (PullToRefreshListView) findViewById(R.id.weibolist); linearLayoutHome = (LinearLayout) findViewById(R.id.ll_home_layout); username = (TextView) this.findViewById(R.id.tv_home_name); btn_post_weibo = (Button) this.findViewById(R.id.btn_home_post_weibo); btn_reload = (Button) this.findViewById(R.id.btn_home_reload); weiboListView.setOnItemClickListener(this); btn_post_weibo.setOnClickListener(this); btn_reload.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = null; GlobalObject globalObject = Tools.getGlobalObject(this); switch (v.getId()) { case R.id.btn_home_post_weibo: // 发布微博 intent = new Intent(HomeActivity.this, PostWeibo.class); startActivity(intent); break; case R.id.btn_home_reload: // 刷新列表 long sinceId = homeData.weiboListAdapter.getMaxId() + 1; WeiboManager.getHomeTimeline(this, sinceId, 0, DEFAULT_STATUS_COUNT, true, new StatusRequestListenerImpl( this, linearLayoutHome, HOME)); View homeReloadAnim = findViewById(R.id.pb_home_reload); View homeReload = findViewById(R.id.btn_home_reload); homeReloadAnim.setVisibility(View.VISIBLE); homeReload.setVisibility(View.GONE); break; } } @Override public void doneProcess(ParentTask task) { Message msg = new Message(); msg.obj = task; if (task instanceof PullFileTask) { msg.what &