運用Facebook的Graph api取得資訊–
因為我有時做一個給使用者留言的List
所以希望可以將每個使用者的FB id存在databse中,接著將每個使用者的name還有image都讀取出來
以下是我實作利用user id讀取user name的方式
GraphRequest是Facebook函式庫裡頭extend Object的函式(官方文件)
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
try {
Log.d("Name",object.getString("name"));
}catch (JSONException e){
Log.d("Error",e.toString());
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();
[延伸一]:可以直接設定URL,用以往Request方式來讀取資料
URL = “https://graph.facebook.com/id=?”+ userid +”&access_token=”+ AccessToken.getCurrentAccessToken().getToken()
只是還需要自己完成整個GET request的方式(使用Volley或是HttpRequest這類的)
相對來說麻煩了些
[延伸二]:使用FB graph api explore可以幫助測試:https://developers.facebook.com/tools/explorer
有趣的是取得FB使用者的大頭照是不需要AccessToken的
可以用一般的URL直接讀取
這部分我就另外用Volley做處理
另外,因為測試的留言變多了
所以我實作了動態載入Listview,其實也蠻簡單的
就只是宣告 當ListView被滑動時檢查動態,如果目前螢幕上顯示的第一行List加上螢幕呈現的總List數為全部List數
(OS:就是拉到底的意思了~)
此時就做動態載入的動作
這邊有個小Bug,因為Volley是另外開Thread跑,而執行當中UI Thread仍然值續執行
所以我之前測試時不斷的載入舊資料OTZ
最後解決辦法就是宣告一個全域變數儲存應該要載入的List編號
有執行這種Multi-Thread情況時要特別注意與UI間的配合
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if((firstVisibleItem + visibleItemCount) == totalItemCount){
Log.d("Onscroll",Integer.toString(firstVisibleItem)+":"+Integer.toString(visibleItemCount));
listcount += 5;
callWeatherComment(listcount);
}
}
});
研究Volley的lrucache,lrucache是Android 設置的內存
減少反覆發送Request的麻煩
一直在研究始終搞不太懂
後來發現說,當使用volley的imageloader時,此時會需要實作bitmapcache的部分(設置cache大小)
之後將bitmapcache引入imageloader後,volley會自動執行cache這部分的操作(使用的是level2 Cache)
參考資料:http://blog.csdn.net/guolin_blog/article/details/17482165
使用FB user id 讀取姓名與大頭貼照片,以下這段是實作在ListAdapter當中
另外FB有提供 NetworkImageView,有興趣可以查查
紀錄這麼雜亂也不知道有沒有人看得懂(或是有沒有人要看?XD
FB SDK頻頻更新,目前到了第四版,網路資料許多都十分舊,大多數又是英文
所以自己多次Try and error後決定記錄下來,希望對大家有些幫助
完整程式碼:https://github.com/sj82516/Weatherer
//String uid = cmt.getName();
String uid = cmt.getName();
//get facebook name
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response){
if(object!=null) {
try {
txt_name.setText(object.getString("name"));
} catch (JSONException e) {
txt_name.setText("android");
}
}else{
txt_name.setText("android");
}
}
}
);
Bundle parameters = new Bundle();
parameters.putString("id",uid);
request.setParameters(parameters);
request.executeAsync();
//load facebook account icon
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
String img_value ="http://graph.facebook.com/"+uid+"/picture?type=large";
img_icon.setImageUrl(img_value, imageLoader);