1

我从 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>

日志猫

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
4

3 回答 3

1

您正在主线程上执行(可能很慢)网络操作。如果您的目标 SDK 是 11 (Honeycomb) 或更高版本,这将NetworkOnMainThreadException在 Honeycomb 或更高版本上抛出异常,因为此行为可能会阻塞 UI 并导致应用程序无响应。即使在预 Honeycomb 设备上,也不鼓励这种行为

您可以使用 anAsyncTask来解决这个问题,将数据加载到其doInBackground(..).

于 2012-08-09T13:12:20.017 回答
1

出于某种原因,InputStream 为 NULL,因此会抛出 NullPointerExeption。在您的 OpenHttpConnection 方法中,添加 catchLog.i("OpenHttpConnection",ex.getMessage());并查看原因。

不要阻塞 UI 线程,必须使用 AsyncTask、Service 或自定义线程。你会喜欢这个课程http://code.google.com/p/and-bookworm/source/browse/trunk/src/com/totsp/bookworm/data/HTTPRequestHelper.java?r=31。在构造函数中,传递一个自定义的 ResponseHandler 并进行您需要的操作。

于 2012-08-09T12:50:44.357 回答
0

您应该将网络操作从 UI 线程移动到服务或 AsyncTask

你可以在这里阅读更多:http ://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html

于 2012-08-09T12:33:20.660 回答