我从网上下载图片到我的android项目时遇到了一些问题。每当我尝试连接到互联网时,我的应用程序就会一直崩溃 是的我将权限添加到Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET"/>
logCat说:
06-02 12:15:36.520: E/AndroidRuntime(13947): FATAL EXCEPTION: main
06-02 12:15:36.520: E/AndroidRuntime(13947): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.MyAppActivity}: android.os.NetworkOnMainThreadException
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.os.Looper.loop(Looper.java:137)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.lang.reflect.Method.invokeNative(Native Method)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.lang.reflect.Method.invoke(Method.java:511)
06-02 12:15:36.520: E/AndroidRuntime(13947): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-02 12:15:36.520: E/AndroidRuntime(13947): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-02 12:15:36.520: E/AndroidRuntime(13947): at dalvik.system.NativeStart.main(Native Method)
06-02 12:15:36.520: E/AndroidRuntime(13947): Caused by: android.os.NetworkOnMainThreadException
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.net.InetAddress.getAllByName(InetAddress.java:220)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
06-02 12:15:36.520: E/AndroidRuntime(13947): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.net.URLConnection.getContent(URLConnection.java:194)
06-02 12:15:36.520: E/AndroidRuntime(13947): at java.net.URL.getContent(URL.java:447)
06-02 12:15:36.520: E/AndroidRuntime(13947): at com.my.app.MyAppActivity.onCreate(MyAppActivity.java:25)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.Activity.performCreate(Activity.java:4465)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-02 12:15:36.520: E/AndroidRuntime(13947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-02 12:15:36.520: E/AndroidRuntime(13947): ... 11 more
现在花了将近一个小时试图找出问题所在......
答案 0 :(得分:3)
如果您使用的方法在onCreate()中下载图像,它将表现为同步操作 - 也就是说,它将不会返回控制权 下载图像 - 直接调用它将冻结您的活动的UI。这是不允许的 在Android 3.0及更高版本中;必须使用AsyncTask类包装所有同步代码。 运用 AsyncTask使您可以在单独的线程中执行后台任务,然后返回结果 在UI线程中。这样,您可以执行后台操作,而无需处理复杂的操作 线程问题。
要异步调用DownloadImage()方法,需要将代码包装在。的子类中 AsyncTask类,如下所示:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return DownloadImage(urls[0]);
}
protected void onPostExecute(Bitmap result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
答案 1 :(得分:1)
你必须使用AsyncTask从服务器下载图像,因为你的主线程无法处理它。你正在尝试在主线程中下载图像。所以NetworkOnMainThreadException出现。所以在单独的线程中下载图像。< / p>
答案 2 :(得分:0)
每个内容都必须在一个单独的线程上下载......你可以使用AsyncTask,Thread ...
答案 3 :(得分:0)
你应该使用异步任务,这是一个安全的守卫,所以你的主线程(ui线程)不会挂起。他们把它放在3.0或3.1的位置,只为你挖出一个旧帖子为你做
HTTP POST request ANDROID 4 (working in 2.3)?
反对android并在主线程中进行联网将是非常糟糕的做法。他们这样做是有原因的,如果你不这样做,很可能会这样做。
答案 4 :(得分:0)
创建响应式应用程序的一个好习惯是确保主UI线程完成最少量的工作。任何可能挂起应用程序的潜在长任务都应该在不同的线程(后台线程)中处理。当您在主线程上处理长时间操作时,您会失去对Android应用程序的响应,如果您在网络操作中使用此类任务,则会导致android.os.NetworkOnMainThreadException
异常抛出。
此类任务的典型示例是网络操作,其涉及不可预测的延迟。用户可以容忍一些暂停,特别是如果你提供反馈意见正在进行中,但冻结的应用程序不会给他们任何线索。
在这个article中,我们将创建一个简单的图像下载器来说明这种模式
你将了解不同的approches之间的区别,最后你必须记住正确的方法来进行这样的操作!!
您还可以看到处理延迟加载操作的此类似SO thread
答案 5 :(得分:0)
请参阅此answer
当应用程序尝试在其主线程上执行网络操作时引发的异常。
仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。请参阅文档设计响应性。
有关详细信息,请访问Android developer site