我有一个正在下载文件的asynchTask
,工作正常。但是,我想考虑下载中途的互联网连接,然后在连接恢复后尝试重新启动下载。
为此,我尝试将下载放入Runnable
,这样如果我发现错误,我可以在连接恢复后重新运行runnable。
当我尝试运行它时,我得到一个异常,说它正在使用主线程(请参阅下面的logcat),我正在调用doInBackground()
中的runnable,所以可能它应该在一个单独的线程上运行,或者我的推理错了吗?
发布代码实际上是不可能的,因为它是〜1000行代码,我宁愿被告知为什么我的推理错误而不是有人为我修改代码,因为我更有可能从中学习。
logcat的
android.os.NetworkOnMainThreadException
E/BxmcGFT ( 3808): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
E/BxmcGFT ( 3808): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
E/BxmcGFT ( 3808): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
E/BxmcGFT ( 3808): at java.net.InetAddress.getAllByName(InetAddress.java:214)
E/BxmcGFT ( 3808): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
E/BxmcGFT ( 3808): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
E/BxmcGFT ( 3808): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
E/BxmcGFT ( 3808): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
E/BxmcGFT ( 3808): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
E/BxmcGFT ( 3808): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
E/BxmcGFT ( 3808): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
E/BxmcGFT ( 3808): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
E/BxmcGFT ( 3808): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
E/BxmcGFT ( 3808): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
E/BxmcGFT ( 3808): at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:75)
E/BxmcGFT ( 3808): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:136)
E/BxmcGFT ( 3808): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:90)
E/BxmcGFT ( 3808): at my.package.GetDownLoadFileTask$1.run(GetDownLoadFileTask.java:467)
E/BxmcGFT ( 3808): at android.os.Handler.handleCallback(Handler.java:615)
E/BxmcGFT ( 3808): at android.os.Handler.dispatchMessage(Handler.java:92)
E/BxmcGFT ( 3808): at android.os.Looper.loop(Looper.java:137)
E/BxmcGFT ( 3808): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/BxmcGFT ( 3808): at java.lang.reflect.Method.invokeNative(Native Method)
E/BxmcGFT ( 3808): at java.lang.reflect.Method.invoke(Method.java:511)
E/BxmcGFT ( 3808): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/BxmcGFT ( 3808): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/BxmcGFT ( 3808): at dalvik.system.NativeStart.main(Native Method)
给出错误的行是
androidHttpTransport.call(soapUri, envelope);
同样问题是为什么runnable在从doInBackground()
调用时在主线程上运行?这会在一个线程而不是AsynchTask
上做得更好吗?