我从URL下载图像并显示在ImageView
中。这个示例在2.3.3模拟器上运行良好,但是当我在4.0或4.1上尝试时,它崩溃并显示以下消息:
不幸的是,AndroidWebImageExample已停止。
LogCat显示我得到一个NullPointerException
。有人知道为什么它不能在4.0或4.1上运行吗?
MainActivity.java
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
String image_URL = "http://4.bp.blogspot.com/_C5a2qH8Y_jk/StYXDpZ9-WI/AAAAAAAAAJQ/sCgPx6jfWPU/S1600-R/android.png";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView bmImage = (ImageView) findViewById(R.id.image);
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
Bitmap bm = LoadImage(image_URL, bmOptions);
bmImage.setImageBitmap(bm);
}
private Bitmap LoadImage(String URL, BitmapFactory.Options options) {
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in, null, options);
in.close();
} catch (IOException e1) {
}
return bitmap;
}
private InputStream OpenHttpConnection(String strURL) throws IOException {
InputStream inputStream = null;
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setRequestMethod("GET");
httpConn.connect();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = httpConn.getInputStream();
}
} catch (Exception ex) {
}
return inputStream;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="hello"
/>
<ImageView
android:id="@+id/image"
android:scaleType="centerCrop"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
LogCat
07-20 14:09:08.689: D/AndroidRuntime(1894): Shutting down VM
07-20 14:09:08.689: W/dalvikvm(1894): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
07-20 14:09:08.699: E/AndroidRuntime(1894): FATAL EXCEPTION: main
07-20 14:09:08.699: E/AndroidRuntime(1894): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.androidwebimageexample/com.example.androidwebimageexample.MainActivity}: java.lang.NullPointerException
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread.access$600(ActivityThread.java:130)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.os.Handler.dispatchMessage(Handler.java:99)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.os.Looper.loop(Looper.java:137)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread.main(ActivityThread.java:4745)
07-20 14:09:08.699: E/AndroidRuntime(1894): at java.lang.reflect.Method.invokeNative(Native Method)
07-20 14:09:08.699: E/AndroidRuntime(1894): at java.lang.reflect.Method.invoke(Method.java:511)
07-20 14:09:08.699: E/AndroidRuntime(1894): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-20 14:09:08.699: E/AndroidRuntime(1894): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-20 14:09:08.699: E/AndroidRuntime(1894): at dalvik.system.NativeStart.main(Native Method)
07-20 14:09:08.699: E/AndroidRuntime(1894): Caused by: java.lang.NullPointerException
07-20 14:09:08.699: E/AndroidRuntime(1894): at com.example.androidwebimageexample.MainActivity.LoadImage(MainActivity.java:43)
07-20 14:09:08.699: E/AndroidRuntime(1894): at com.example.androidwebimageexample.MainActivity.onCreate(MainActivity.java:33)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.Activity.performCreate(Activity.java:5008)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
07-20 14:09:08.699: E/AndroidRuntime(1894): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
07-20 14:09:08.699: E/AndroidRuntime(1894): ... 11 more
最佳答案
您正在主线程上执行(可能很慢)网络操作。如果您的目标SDK为11(Honeycomb)或更高版本,则会在Honeycomb或更高版本上抛出NetworkOnMainThreadException
,因为此行为可能会阻止UI并导致应用程序无响应。即使在蜂窝前设备this behaviour is discouraged上。
您可以使用AsyncTask
解决此问题,将数据加载到其doInBackground(..)
中。