2012-02-22 5 views
3

У меня проблема с ICS, когда я пытаюсь использовать Google Calendar api. Чтобы получить список событий, у меня есть AsyncTask и внутри doInBackground() я делаю вызовы службы, но все же получаю ошибку NetworkOnMainThreadException.Android NetworkOnMainThreadException внутри AsyncTask

Вот мой код:

Я называю мой AsyncTask так:

new GoogleCalendarEvents().execute(new Object()); 

И мой AsyncTask выглядит следующим образом:

private class GoogleCalendarEvents extends AsyncTask<Object, Object, Object> { 

     @Override 
     protected Object doInBackground(Object... objects) { 

      OAuthManager manager = OAuthManager.getInstance(); 
      /* login to google api and get the auth token */ 
      manager.doLogin("", true, mActivity, new OAuthManager.AuthHandler() { 
       @Override 
       public void handleAuth(Account account, String authToken) { 
        if (account != null) { 
         /* create a google Calendar service if the returned account is not null */ 
         com.google.api.services.calendar.Calendar service = CalendarServiceBuilder.build(OAuthManager.getInstance().getAuthToken()); 
         try { 

          /* get the list of events for the primary calendar */ 
          /* ---------HERE THE APP IS CRUSHING --------- */ 
          mEvents = service.events().list(mCalendarId).execute(); 

          while (true) { 
           /* get the next page token if any */ 
           String pageToken = mEvents.getNextPageToken(); 

           if (pageToken != null && !pageToken.equals("")) { 
            /* if there are other pages, get the next page */ 
            Events newPageEvents = service.events().list(mCalendarId) 
              .setPageToken(pageToken).execute(); 

            for (Event event : newPageEvents.getItems()) { 
             /* loop through all the events and add them into the mEvents */ 
             mEvents.put(event.getId(), event); 
            } 

           } else { 
            break; 
           } 
          } 
          /* make sure we wont have memory leaks */ 
          mActivity = null; 
          /* notify the caller that the calendar events are ready */ 
          mEventsReceiverCallback.calendarEventsReceived(true); 
          mEventsReceiverCallback = null; 

         } catch (IOException e) { 
          /* let the user know that the event could not be created */ 
          Utility.showInformationDialog(mActivity, mActivity.getString(R.string.error), 
            mActivity.getString(R.string.error_message_bad_request_get_events)); 
          /* make sure we wont have memory leaks */ 
          mActivity = null; 
          /* print the error into the log */ 
          e.printStackTrace(); 
          /* notify the caller that the manager could not get the calendar events */ 
          mEventsReceiverCallback.calendarEventsReceived(false); 
          mEventsReceiverCallback = null; 

         } 

        } else { 

         /* le the user know that the event could not be created */ 
         Utility.showInformationDialog(mActivity, mActivity.getString(R.string.error), 
           mActivity.getString(R.string.error_message_connection)); 
         /* make sure we wont have memory leaks */ 
         mActivity = null; 
         /* notify the caller that the manager could not get the calendar events */ 
         mEventsReceiverCallback.calendarEventsReceived(false); 
         mEventsReceiverCallback = null; 

        } 
       } 
      }); 

      return null; 
     } 

    } 

И журнал:

02-22 10:32:08.597: ERROR/AndroidRuntime(13924): FATAL EXCEPTION: main 
     android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
     at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
     at java.net.InetAddress.getAllByName(InetAddress.java:220) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
     at com.google.api.client.http.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:58) 
     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:639) 
     at com.google.api.client.http.json.JsonHttpClient.execute(JsonHttpClient.java:257) 
     at com.google.api.client.googleapis.services.GoogleClient.execute(GoogleClient.java:121) 
     at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:67) 
     at com.google.api.services.calendar.Calendar$Events$List.execute(Calendar.java:2643) 
     at /* here is the error, I think */com.google.calendar.manager.business.CalendarEventProvider$GoogleCalendarEvents$1.handleAuth(CalendarEventProvider.java:118) 
     at com.google.calendar.manager.utils.OAuthManager$1.run(OAuthManager.java:194) 
     at android.accounts.AccountManager$10.run(AccountManager.java:1264) 
     at android.os.Handler.handleCallback(Handler.java:605) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4424) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     at dalvik.system.NativeStart.main(Native Method) 

Here говорит, что я должен использовать AndroidHttp.newCompatibleTransport() как класс транспорта, и я использую его в своем CalendarServiceBuilder.

Что может вызвать эту ошибку и как я могу решить проблему?

Спасибо!

ответ

3

Кажется, проблема была в манифесте .. У меня был этот атрибут в использовании-SDk теге:

android:targetSdkVersion="10" 

После я удалил этот атрибут, приложение работало.

+0

Звучит немного странно. Такое исключение было введено, чтобы избежать долгого выполнения задачи в потоке пользовательского интерфейса. Я попробую снова проверить ваш код, чтобы быть уверенным, что все, что потребует доступа к сети, не выполняется в потоке пользовательского интерфейса. Что-нибудь в onPostExecute? – Blackbelt

+0

Я дважды проверял, спасибо за подсказку, я знаю, почему эта ошибка должна начаться, и я попытался сделать простой запрос Google с помощью метода addroid sdk HttpGet и реально работал без проблем, и если бы я переключил код внутри этой asyncTask с помощью Google Calendar один, появилась ошибка. После того, как я изменил это в манифесте, это сработало – Cata

+0

OMG, это действительно сработало. У меня была такая же проблема, после чего я удалил атрибут android: targetSdkVersion. Теперь приложение прекрасно загружается. – curiousguy

0

Вы тестируете это на эмуляторе? По какой-то причине у меня такая же проблема при тестировании на эмуляторе при потоковой передаче .mpjeg внутри AsyncTask; однако, когда я тестирую его на устройстве, он работает нормально.

Это может быть проблема с эмулятором; однако это также может быть что-то с ICS (эмулятор i 4.0.3, но на 2.3.7 CM7b257 на моем телефоне), но попробуйте, так как это вполне может быть вашей проблемой.

+0

она работает на вашем 2.3.7, потому что NetworkOnMainThreadException был в андроиде, так как апи 11 – Blackbelt

+0

я проверить это на Nexus S устройства с Android 4.0.3 – Cata

+0

@blackbelt Спасибо за информацию - даже не думал, чтобы проверить что. Интересно, хотя, поскольку у меня есть все в фоновой задаче; Мне придется перепроверить этот проект позже. –

Смежные вопросы