編輯:關於Android編程
二.獲取用戶信息並保存數據庫
上面說到加載AuthActivity有兩種情況,其中一種就是授權成功回調,在授權回調成功後我們就開始通過微博API獲取用戶信息了,然後保存數據庫了。這一系列操作我采用主框架模式,將任務發送給MainService來處理。
對於這個任務的具體處理過程,先通過token獲取UID,再通過UID獲取UserInfo。UserInfo中值得注意的是UserIcon是Bitmap類型的,這裡涉及到一個通過url獲取Bitmap的方法,這裡就不細講了。
MainService.java中的doTask方法:
public void doTask(Task task)
{
Message msg=handler.obtainMessage();
msg.what=task.getTaskID();
switch(task.getTaskID())
{
//登錄操作
case Task.WEIBO_LOGIN:
break;
//通過access_token獲取用戶信息,並保存到數據庫操作
case Task.GET_USERINFO_BY_TOKEN:
{
Oauth2AccessToken access_token=(Oauth2AccessToken)task.getParams().get(token);
Log.i(OUTPUT, access_token:+access_token.getToken());
/**
* 步驟一:用授權碼來獲取用戶Uid
*/
//請求獲取uid
String uid=;
GetUserInfo.reqUID(access_token);
//獲取uid
do{
uid=GetUserInfo.getUID();
}while(uid.equals());
/**
* 步驟二:通過uid,token獲取UserInfo
*/
//請求獲取用戶信息
long _uid=Long.parseLong(uid);
UserInfo user=new UserInfo();
GetUserInfo.reqUserInfo(access_token, _uid);
//獲取UserInfo
do{
user=GetUserInfo.getUserInfo();
}while(user.getUserName().equals());
user.setUserId(uid);
//Log.i(OUTPUT,username:+user.getUserName()+userid++user.getUserId()+usericon+user.getUserIcon());
/**
* 步驟三:把UserInfo的數據保存到數據庫總
*/
//創建數據庫
DBUserInfo db=new DBUserInfo(getActivityByName(AuthActivity));
//如果該數據不存在數據庫中
if(db.getUserInfoByUserId(uid)==null)
{
//插入
db.insertUserInfo(user);
Log.i(OUTPUT,保存數據庫成功);
}
//如果該數據已經存在數據庫中
else
{
//修改
Log.i(OUTPUT,數據修改成功);
}
msg.obj=成功;
}
break;
//登錄界面獲取用戶信息顯示操作
case Task.GET_USERINFO_IN_LOGIN:
break;
default :
break;
}
handler.sendMessage(msg);
}
上面的微博API操作都是異步的操作所以同樣采取先請求,然後獲取的操作。這種方式在授權部分已經講的很清楚了。
然後就是保存數據庫的操作,這裡都是最基本的數據庫使用方式了,就是有一點需要注意的是,UserIcon保存的是BOLB二進制數據。
GetUserInfo.java //利用微博API獲取用戶信息的工具方法類
package com.fangjie.weibo.util;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import com.fangjie.weibo.bean.UserInfo;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.WeiboException;
import com.weibo.sdk.android.api.AccountAPI;
import com.weibo.sdk.android.api.UsersAPI;
import com.weibo.sdk.android.net.RequestListener;
/**
* GetUserInfo類
* 通過API獲取用戶信息
* @author 方傑
* @date 2013-7-29
*/
public class GetUserInfo {
public static String UID=;
private static UserInfo user;
/**
* 通過accessToken請求用戶信息UID
* @param accessToken
*/
public static void reqUID(Oauth2AccessToken accessToken)
{
AccountAPI account=new AccountAPI(accessToken);
account.getUid(new RequestListener(){
@Override
public void onComplete(String result) {
// TODO Auto-generated method stub
try {
JSONObject object =new JSONObject(result);
UID=object.getString(uid);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onError(WeiboException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onIOException(IOException arg0) {
// TODO Auto-generated method stub
}
});
}
/**
* 請求UID之後,獲取UID
* @return string
*/
public static String getUID()
{
String id=UID;
UID=;
return id;
}
/**
* 通過accessToken,uid請求獲取用戶信息UserInfo(name,icon......)
* @param accessToken
* @param uid
*/
public static void reqUserInfo(final Oauth2AccessToken accessToken,long uid)
{
user=new UserInfo();
UsersAPI userapi=new UsersAPI(accessToken);
userapi.show(uid, new RequestListener() {
@Override
public void onIOException(IOException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(WeiboException arg0) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(String arg0) {
// TODO Auto-generated method stub
JSONObject object;
try {
object = new JSONObject(arg0);
Bitmap bm=GetUserInfo.getBitmap(object.getString(profile_image_url));
GetUserInfo.user.setUserIcon(bm);
GetUserInfo.user.setToken(accessToken.getToken());
GetUserInfo.user.setIsDefault(0);
GetUserInfo.user.setUserName(object.getString(screen_name));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public static UserInfo getUserInfo()
{
Log.i(OUTPUT,user.getUserName());
return user;
}
public static Bitmap getBitmap(String biturl)
{
Bitmap bitmap=null;
try {
URL url=new URL(biturl);
URLConnection conn=url.openConnection();
InputStream in =conn.getInputStream();
bitmap=BitmapFactory.decodeStream(new BufferedInputStream(in));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
}
DBUserInfo.java //操作用戶信息的數據庫工具方法類
package com.fangjie.weibo.db;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import com.fangjie.weibo.bean.UserInfo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.util.Log;
public class DBUserInfo {
private DBHelper dbhelper;
public DBUserInfo(Context context)
{
dbhelper = new DBHelper(context);
}
/**
* 添加用戶信息
* @param UserInfo
*/
public void insertUserInfo(UserInfo user)
{
SQLiteDatabase db = dbhelper.getWritableDatabase();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
user.getUserIcon().compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] usericon=baos.toByteArray();
ContentValues values = new ContentValues(5);
values.put(UserInfo.USER_ID,user.getUserId());
values.put(UserInfo.USER_NAME, user.getUserName());
values.put(UserInfo.TOKEN,user.getToken());
values.put(UserInfo.IS_DEFAULT,user.getIsDefault());
values.put(UserInfo.USER_ICON,usericon);
db.insert(UserInfo.TB_NAME, null, values);//表名稱
db.close();
}
/**
* 根據用戶userId獲取用戶對象
* @param String
* @return UserInfo
*/
public UserInfo getUserInfoByUserId(String uid)
{
SQLiteDatabase db = dbhelper.getReadableDatabase();
Cursor cursor =db.query(UserInfo.TB_NAME, new String[]{UserInfo.ID,UserInfo.IS_DEFAULT,UserInfo.TOKEN,
UserInfo.USER_ID,UserInfo.USER_NAME,UserInfo.USER_ICON},
UserInfo.USER_ID +=?,new String[]{uid}, null, null, null);
UserInfo userInfo =null;
if(null != cursor)
{
if(cursor.getCount() >0)
{
cursor.moveToFirst();
userInfo = new UserInfo();
Long id =cursor.getLong(cursor.getColumnIndex(UserInfo.ID));
String uId = cursor.getString(cursor.getColumnIndex(UserInfo.USER_ID));
String userName = cursor.getString(cursor.getColumnIndex(UserInfo.USER_NAME));
String token = cursor.getString(cursor.getColumnIndex(UserInfo.TOKEN));
String isDefault = cursor.getString(cursor.getColumnIndex(UserInfo.IS_DEFAULT));
byte[] byteIcon = cursor.getBlob(cursor.getColumnIndex(UserInfo.USER_ICON));
userInfo.setId(id);
userInfo.setUserId(uId);
userInfo.setIsDefault(isDefault);
userInfo.setToken(token);
userInfo.setToken(token);
userInfo.setUserName(userName);
if(null !=byteIcon)
{
Bitmap userIcon=BitmapFactory.decodeByteArray(byteIcon, 0, byteIcon.length);
userInfo.setUserIcon(userIcon);
}
}
}
db.close();
return userInfo;
}
/**
* 獲取數據庫所有授權用戶信息
* @param
* @return List
*/
public List getAllUserInfo()
{
List users=new ArrayList();
SQLiteDatabase db = dbhelper.getReadableDatabase();
Cursor cursor =db.query(UserInfo.TB_NAME, new String[]{UserInfo.ID,UserInfo.IS_DEFAULT,UserInfo.TOKEN,
UserInfo.USER_ID,UserInfo.USER_NAME,UserInfo.USER_ICON},
null,null, null, null, null);
UserInfo userInfo =null;
while(cursor.moveToNext())
{
userInfo = new UserInfo();
Long id =cursor.getLong(cursor.getColumnIndex(UserInfo.ID));
String uId = cursor.getString(cursor.getColumnIndex(UserInfo.USER_ID));
String userName = cursor.getString(cursor.getColumnIndex(UserInfo.USER_NAME));
String token = cursor.getString(cursor.getColumnIndex(UserInfo.TOKEN));
String isDefault = cursor.getString(cursor.getColumnIndex(UserInfo.IS_DEFAULT));
byte[] byteIcon = cursor.getBlob(cursor.getColumnIndex(UserInfo.USER_ICON));
userInfo.setId(id);
userInfo.setUserId(uId);
userInfo.setIsDefault(isDefault);
userInfo.setToken(token);
userInfo.setUserName(userName);
if(null !=byteIcon)
{
Bitmap userIcon=BitmapFactory.decodeByteArray(byteIcon, 0, byteIcon.length);
Log.i(OUTPUT,dbuserinfo+userIcon);
userInfo.setUserIcon(userIcon);
}
users.add(userInfo);
}
db.close();
return users;
}
}
還記得在上面的AuthActivity中我們發送的GET_USERINFO_BY_TOKEN (獲取授權用戶信息並保存數據庫)這個任務,這個任務完成後,我們會在refresh()方法中跳到LoginActivity。在LoginActivity的初始時,我們會發送GET_USERINFO_IN_LOGIN(獲取所有授權用戶信息),在做這個任務處理時也就是數據庫的操作。
//登錄界面獲取用戶信息顯示操作
case Task.GET_USERINFO_IN_LOGIN:
{
DBUserInfo db=new DBUserInfo(getActivityByName(LoginActivity));
List users=db.getAllUserInfo();
msg.obj=users;
}
其他:
講完上面這些,我突然想講講這個addActivty,reMoveActivty,getActivityByName
/**
* UI層向MainService中發送任務的同時,同樣要發送自己Activity,
* 以便在MainService中調用refresh();
* @param task
*/
public static void addActivty(Activity activity)
{
appActivities.add(activity);
}
/**
* UI層中有向MainService中傳遞Activity,在任務結束後(refresh),應去除該Activity,防止混淆!
* eg:在LoginActivity中的GET_USERINFO_IN_LOGIN任務會隨Activity的每次重新加載而開始一次,如果不去除
* activity的話,會導致本次refresh的是上次的activity的實例。因為獲取activity是通過getActivityByName,這兩
* 次的activity實例的name是相同的。
* @param activity
*/
public static void reMoveActivty(Activity activity)
{
appActivities.remove(activity);
}
特別是reMoveActivty這個方法,我自己在做項目的時候就忘記了在每次完成任務時去刪除這個Activity實例,導致了這樣一個錯誤:
程序啟動的時候會到LoginActivity,這時候做了一次GET_USERINFO_IN_LOGIN,就把LoginAcivity的一個實例傳到activities中,當我再次添加一個授權用戶信息,完成後再次跳到LoginActivity時,這時界面上就沒有任何顯示信息。因為當第二次跳到LoginActivity時,再次傳一個LoginActivity的實例,而我在完成任務後refresh()時,刷新的是第一次的LoginActivity實例,所以對第二次的LoginActivity當然是沒有顯示。
通過上面這三個方法的配合我們就可以由Activity向一些工具類方法傳遞Context上下文的參數,比如在建立數據庫時需要Context這個參數,還有在工具類中跳轉的時候也需要用到Context參數。雖然這種傳參可能會增加層與層之間的耦合度,但是我目前就這水平,也請大家給我指點。
歡迎各位關注我的個人站點:http://fangjie.sinaapp.com/
android——解決端口占用問題導致的模擬器無法識別
遇到一個問題:昨天模擬器工作還正常,今天eclipse就識別不了了。後來發現是360手機助手占用了5555端口造成的,我就納悶了,平時這個也不是自動啟動,今天就啟動了。廢
麥芒5和榮耀8哪個好 麥芒5和榮耀8對比
最近,華為的新機可以說是不斷湧出,這不,剛剛發布了由吳亦凡代言的榮耀8新機,隨之又發布了華為麥芒5,那麼有很多朋友都在問,麥芒5和榮耀8哪個好?麥芒5和榮耀
Android音頻開發之基礎知識介紹
先來點閒言碎語,前段時間我有一段感悟:Android開發,本身並不是一個可以走得多遠的方向,它只是一個平台,提供了許多封裝好的API,讓大家能夠快速開發出針對特定業務的應
Android PullToRefresh 下拉刷新,上拉更多,支持ScrollView,ListView,可方便拓展GridView,WebView等
在寫著東西之前,從網上找到很多這方面的源碼,但是基本沒有找到滿意的,包括在GitHub上的比較有名的Android-PullToRefresh-master,思來想去還是