2012-02-22 14 views
3

GoogleカレンダーAPIを使用しようとするとICSに問題があります。イベントのリストを取得するには、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

少し奇妙に聞こえます。この種の例外は、UIスレッドで長時間実行されるタスクを回避するために導入されました。ネットワークアクセスが必要なものがすべてUIスレッドで実行されないように、コードを再度確認することをお勧めします。 onPostExecuteの何か? – Blackbelt

+0

私は二重チェック、チップありがとう、私はそのエラーが開始する必要があります知っていると私はadnroid SDKのHttpGetメソッドで単純なGoogleリクエストを作成しようとした実際には問題なく働いていたと私はそのasyncTaskグーグルカレンダー1、エラーが表示され..私はマニフェストでそれを変更した後、それは実際に働いた – Cata

+0

OMGを働いた。私は同じ問題があった後、アンドロイド:targetSdkVersion属性を削除しました。今、アプリは正常に読み込んでいます。 – curiousguy

0

これはエミュレータでテストしていますか?何らかの理由で、AsyncTask内で.mpjegをストリーミングしているときに、エミュレータでテストするときに同じ問題が発生します。しかし、私はそれを正常に動作するデバイスでそれをテストします。

エミュレータの問題である可能性があります。しかしそれはまたICS(私はエミュレータ4.0.3しかし、私の電話で2.3.7 CM7b257を実行する)と何かかもしれませんが、非常にあなたの問題になる可能性があるようにそれを試してみてください。

+0

NetworkOnMainThreadException が、私は情報をお寄せいただきありがとうございます@blackbeltのAndroid 4.0.3 – Blackbelt

+0

以来、アンドロイドにあったので、それはあなたの2.3.7で動作します - でもチェックすること考えていませんでしたそれ。私はバックグラウンドタスクの中にすべてを持っているので興味深い。私はそのプロジェクトを後で再チェックしなければならない。 – Cata

+0

とネクサスSデバイス上でこれをテストするAPI 11 –