2016-09-25 25 views
-2

基本上,我試圖創建一個活動來通過FirebaseAuth從Google日曆中提取數據。我已成功將FirebaseUser對象轉換爲適當的Account對象,以正確調用Google日曆中的Events方法。不過,我所面臨的問題時,活動對象是空,這裏是我的代碼:在Android中處理來自CalendarProvider的空例外

// Breakthrough 1 
// Miguel has created a wonderful Google Cal API Kickstarter Repo to refer to. 
// https://github.com/miguelarauj1o/GoogleCalendarQuickStart 

/** 
* Breakthrough 2 
* 
* Several issues such as Firebase Support was fixed by attempting to convert FirebaseUser 
* data into an Android.Account Object so that CalendarProvider is able to identify the user 
* properly. 
* 
* However, issues regarding threading came up with an IllegalArgumentException from the start 
* and lots of research was done and these are the helpers to the solution. 
* http://stackoverflow.com/questions/20749044/how-to-get-rid-of-java-lang-illegalstateexception-while-trying-to-getauthtoken-f 
* http://stackoverflow.com/questions/17547019/calling-this-from-your-main-thread-can-lead-to-deadlock-and-or-anrs-while-getti 
*/ 

public class CalendarProvider extends AsyncTask<Void, Void, Events> { 
    static final HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
    static final JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); 

    static final int REQUEST_ACCOUNT_PICKER = 1000; 
    static final int REQUEST_AUTHORIZATION = 1001; 
    static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002; 
    private static Events events; 
    private static DateTime dt; 
    private static final String PREF_ACCOUNT_NAME = "accountName"; 
    private static final String[] SCOPES = { CalendarScopes.CALENDAR_READONLY }; 

    public synchronized static void InitializeCal(SharedPreferences sp, GoogleAccountCredential credential, FirebaseUser user, Context AppContext) { 
     credential = GoogleAccountCredential.usingOAuth2(
       AppContext, Arrays.asList(SCOPES)) 
       .setBackOff(new ExponentialBackOff()) 
       .setSelectedAccountName(sp.getString(PREF_ACCOUNT_NAME, user.getEmail())); 

     mService = new com.google.api.services.calendar.Calendar.Builder(
       transport, jsonFactory, credential) 
       .setApplicationName("Google Calendar API Android Quickstart") 
       .build(); 
    } 

    /** 
    * Fetch a list of the next 10 events from the primary calendar. 
    * @return List of Strings describing returned events. 
    * @throws IOException 
    */ 
    public static List<String> getDataFromApi() throws IOException { 
     // List the next 10 events from the primary calendar. 
     List<String> eventStrings = new ArrayList<>(); 
     try { 
      if (events.getItems() != null) { // If there are events on this date 
       List<Event> items = events.getItems(); 

       for (Event event : items) { 
        DateTime start = event.getStart().getDateTime(); 
        if (start == null) { 
         // All-day events don't have start times, so just use 
         // the start date. 
         start = event.getStart().getDate(); 
        } 
        eventStrings.add(
          String.format("%s (%s)", event.getSummary(), start)); 
       } 
      } 
     } catch (Exception e) { 
      // Else we add a string to tell'em that nothing is here today 
      eventStrings.add("Nothing Today!"); 

      // Debugging String 
      eventStrings.add(e.toString()); 
     } 
     return eventStrings; 
    } 

    @Override 
    protected Events doInBackground(Void... params) { 
     dt = new DateTime(selectedDate); 
     try { 
      events = mService.events().list("primary") 
        .setMaxResults(10) 
        .setTimeMin(dt) 
        .setOrderBy("startTime") 
        .setSingleEvents(true) 
        .execute(); 

      return events; 
     } catch (Exception e) { 

     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Events events) { 
     try { 
      System.out.println(getDataFromApi()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我想知道如何正確處理此類NullPointerExceptions的,因爲我不知道如果錯誤是故意的或不是。

如果是這樣,那麼對我來說很簡單,我只是假設用戶選擇的特定日期已經不存在了。

但是如果不是呢?

回答

1

如果您在返回的後臺線程中出現任何異常return null;因此在postExectution事件中仍然爲空,並且您試圖打印getDataFromApi()。它會解決你的異常問題。

@Override 
     protected void onPostExecute(Events events) { 
      if(this.events==null){ 
      Log.d("Event"," is still null"); 
      return; 
      } 

      try { 
       System.out.println(getDataFromApi()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
+0

謝謝您的信息! – Nicholas