Foursquare 原始碼研究之------登入續

derekzhan發表於2010-12-06

上次說到了登入回撥方法onPostExecute,此方法是AsyncTask的方法,當doInBackground方法執行完後呼叫此方法來處理返回結果.在onPostExecute中主要根據登入結果來做不同的事情,登入成功://傳送登入廣播

sendBroadcast(new Intent(Foursquared.INTENT_ACTION_LOGGED_IN)); 

此廣播的訂閱時在Foursquared類中實現的,首先看此類Foursquared extends Application,Application是android專案執行的一個全域性的狀態 "Base class for those who need to maintain global application state". 可以在Manifest.xml中指定你自定義的application. 在此類中有一個LoggedInOutBroadcastReceiver 來處理接收到的廣播,然後廣播傳送一個message.此message對應有一個TaskHandler.在foursquare中他使用了

mTaskThread = new HandlerThread(TAG + "-AsyncThread");
mTaskThread.start();
mTaskHandler = new TaskHandler(mTaskThread.getLooper());

 上面的方式來建立Handler. 是為了讓handler執行在新的執行緒中. 接下來看handleMessage方法對msg的處理.第一個switch case語句是MESSAGE_UPDATE_USER, 更新一下使用者的資訊.同時儲存在SharedPreferenses中.

 

接下來開始一個更新UI的Service  foursquared.requestStartService(); 主要呼叫FoursquaredService類的updateWidgets方法來更新widget.也是在Foursquared類中來進行更新,看handleMessage():

 case MESSAGE_START_SERVICE: //updateWidgets更新元件
    Intent serviceIntent = new Intent(Foursquared.this, FoursquaredService.class);
      serviceIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
      startService(serviceIntent);
      return;

 啟動一個FoursquaredService.

 

接下來返回到主介面 

 // Launch the main activity to let the user do anything.
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);

 如果登入失敗:

sendBroadcast(new Intent(Foursquared.INTENT_ACTION_LOGGED_OUT));//傳送登出廣播.
NotificationsUtil.ToastReasonForFailure(LoginActivity.this, mReason);//根據不同的exception來提示失敗資訊

 最後關閉進度條dismissProgressDialog().

到這裡登入就結束了.寫的比較亂.呵呵.

相關文章