2014-07-17 67 views
-2

原文標題:android.os.NetworkOnMainThreadException與MongoDB遊標在AsyncTask中嗎?在AsyncTask中的android.os.NetworkOnMainThreadException?

我正在使用AndroidStudio和MongoDB後端爲Android開發,儘管使用AsyncTask執行與網絡相關的所有操作,但我仍然收到了NetworkOnMainThreadException。

這是在我們的數據庫類(MYDB)調用GetTasksTask(的AsyncTask的子類)的方法:

public void getStoredTasks(CallbackHandler<ArrayList<PAWTask>> handler) { 
    GetTasksTask task = new GetTasksTask(mongoDB, handler); 
    task.doInBackground(); 
} 

這裏是GetTasksTask類(PAWTaskMongo是蒙戈模型類,並PAWTask是包裝器,在整個該應用中使用):

private class GetTasksTask extends AsyncTask<Void, Void, ArrayList<PAWTask>> { 

    private DB mongoDB; 
    private CallbackHandler handler; 

    public GetTasksTask(DB mongoDB, CallbackHandler handler) { 
     this.mongoDB = mongoDB; 
     this.handler = handler; 
    } 

    @Override 
    protected ArrayList<PAWTask> doInBackground(Void... voids) { 
     ArrayList<PAWTask> storedTasks = new ArrayList<PAWTask>(); 

     DBCollection coll = mongoDB.getCollection(DBMongoParse.PAW_TASK_COLLECTION); 
     BasicDBObject query = new BasicDBObject("isDeleted", false); 

     List<DBObject> tasks = coll.find(query).toArray(); 

     for (DBObject task : tasks) { 
      storedTasks.add(new PAWTask((PAWTaskMongo) task)); 
     } 

     return storedTasks; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<PAWTask> result) { 
     handler.handle(result); 
    } 

} 

爲的CallbackHandler的代碼:

public abstract class CallbackHandler<T> { 
    public abstract void handle(T result); 
} 

這裏是我得到了蒙戈DB(這是做得比較早,當我實例化MYDB類)的一個實例:

private MyDB() { 
    new OpenMongoConnectionTask().execute(); 
} 

private class OpenMongoConnectionTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... voids) { 
     try { 
      MongoClient mongoClient = new MongoClient(); 
      mongoDB = mongoClient.getDB("mydb"); 
      pawTaskCollection = mongoDB.getCollection(PAW_TASK_COLLECTION); 
      pawTaskCompleteCollection = mongoDB.getCollection(PAW_TASK_COMPLETE_COLLECTION); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

,這裏是我得到的異常(它被扔在coll.find(query);線AsyncTask):

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mudd.heatlab.pawpal/com.mudd.heatlab.pawpal.tasklist.TaskListActivity}: android.os.NetworkOnMainThreadException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269) 
     at android.app.ActivityThread.access$800(ActivityThread.java:139) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5102) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
     at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
     at java.net.InetAddress.getByName(InetAddress.java:289) 
     at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:185) 
     at com.mongodb.DBPort.ensureOpen(DBPort.java:255) 
     at com.mongodb.DBPort.<init>(DBPort.java:89) 
     at com.mongodb.DBPortFactory.create(DBPortFactory.java:28) 
     at com.mongodb.PooledConnectionProvider$ConnectionItemFactory.create(PooledConnectionProvider.java:186) 
     at com.mongodb.PooledConnectionProvider$ConnectionItemFactory.create(PooledConnectionProvider.java:183) 
     at com.mongodb.ConcurrentPool.createNewAndReleasePermitIfFailure(ConcurrentPool.java:150) 
     at com.mongodb.ConcurrentPool.get(ConcurrentPool.java:118) 
     at com.mongodb.PooledConnectionProvider.get(PooledConnectionProvider.java:75) 
     at com.mongodb.DefaultServer.getConnection(DefaultServer.java:60) 
     at com.mongodb.BaseCluster$WrappedServer.getConnection(BaseCluster.java:216) 
     at com.mongodb.DBTCPConnector$MyPort.getConnection(DBTCPConnector.java:503) 
     at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:451) 
     at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:286) 
     at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:271) 
     at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84) 
     at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66) 
     at com.mongodb.DBCursor._check(DBCursor.java:458) 
     at com.mongodb.DBCursor._hasNext(DBCursor.java:546) 
     at com.mongodb.DBCursor._fill(DBCursor.java:605) 
     at com.mongodb.DBCursor.toArray(DBCursor.java:640) 
     at com.mongodb.DBCursor.toArray(DBCursor.java:629) 
     at com.mudd.heatlab.pawpal.dbonline.GetTasksTask.doInBackground(GetTasksTask.java:32) 
     at com.mudd.heatlab.pawpal.dbonline.DBMongoParse.getStoredTasks(DBMongoParse.java:130) 
     at com.mudd.heatlab.pawpal.DB.PAWPalDB.getStoredTasks(PAWPalDB.java:106) 
     at com.mudd.heatlab.pawpal.tasklist.TaskListFragment.onCreate(TaskListFragment.java:66) 
     at android.support.v4.app.Fragment.performCreate(Fragment.java:1477) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
     at com.mudd.heatlab.pawpal.tasklist.TaskListActivity.displayTaskList(TaskListActivity.java:67) 
     at com.mudd.heatlab.pawpal.tasklist.TaskListActivity.onCreate(TaskListActivity.java:31) 
     at android.app.Activity.performCreate(Activity.java:5248) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) 

任何幫助將不勝感激。謝謝!

+0

顯然你叫'doInBackground'。別。閱讀任何與asynctask相關的教程。 – njzk2

+0

從我對其他兩個響應的評論可以看出,爲了調試目的,我將其從'execute'改爲了'doInBackground',並忘記將其改回。感謝您的幫助。 – priyald17

回答

0
public void getStoredTasks(CallbackHandler<ArrayList<PAWTask>> handler) { 
GetTasksTask task = new GetTasksTask(mongoDB, handler); 
task.doInBackground(); 
} 

public void getStoredTasks(CallbackHandler<ArrayList<PAWTask>> handler) { 
GetTasksTask task = new GetTasksTask(mongoDB, handler); 
task.execute(); 
} 

中的AsyncTask是在BackThread的控制取代它..

+0

AH是的,我已經改變了,由於其他問題,然後忘了把它改回來。謝謝! – priyald17

相關問題