2012-02-22 87 views
3

当我尝试使用谷歌日历api时,我在ICS上遇到问题。要获取事件列表,我有一个AsyncTask,并在doInBackground()内进行服务调用,但仍收到NetworkOnMainThreadException错误。AsyncTask中的Android NetworkOnMainThreadException

这里是我的代码:

我打电话给我的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 Thread中长时间运行的任务。我会建议再次检查你的代码,以确保所有需要网络访问的东西都不在UI线程上执行。 onPostExecute中的任何内容? – Blackbelt 2012-02-22 16:46:13

+0

我再次检查,谢谢你的提示,我知道为什么该错误应该开始,我试图做出一个简单的谷歌请求与adnroid sdk HttpGet方法和实际工作没有问题,如果我切换在asyncTask与代码谷歌日历之一,错误出现..后,我改变了清单,它工作 – Cata 2012-02-22 17:00:33

+0

OMG,这真的工作。我有同样的问题,然后我删除了android:targetSdkVersion属性。现在应用程序加载正常。 – curiousguy 2012-10-23 18:45:35

0

你在模拟器上测试了吗?出于某种原因,我在使用AsyncTask传输.mpjeg的同时在模拟器上进行测试时遇到同样的问题;但是,当我在设备上测试它的工作正常。

这可能是一个模拟器问题;但它也可能是ICS(我模拟器4.0.3,但在我的手机上运行2.3.7 CM7b257)的东西,但试试看,因为这可能是你的问题。

+0

它适用于您的2.3.7,因为NetworkOnMainThreadException 自API 11 – Blackbelt 2012-02-22 16:20:22

+0

我测试这与Android 4.0.3 – Cata 2012-02-22 16:24:03

+0

一个Nexus S的设备@blackbelt感谢您的信息上了android的 - 没有甚至认为检查那。有趣的是,因为我拥有背景任务中的所有内容;之后我将不得不重新检查该项目。 – 2012-02-22 17:43:27