2 void 1912 void_1912 于 2016.04.12 10:21 提问

android imageview加载网络图片无图片

MainActivity.java

 package study_imageput.com.study_apktointent;

        import android.app.Activity;
        import android.graphics.Bitmap;
        import android.graphics.BitmapFactory;
        import android.os.Bundle;
        import android.widget.ImageView;

        import java.io.InputStream;
        import java.net.HttpURLConnection;
        import java.net.URL;

public class MainActivity extends Activity {
    //定义一个图片显示控件
    private ImageView imageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) this.findViewById(R.id.ivPic);
                String url = "http://images.cnitblog.com/blog/430074/201302/01220037-4e6a57c1199748fea9f8391e7e0548d7.jpg";
                setPicBitmap(imageView, url);

    }

    public static void setPicBitmap(final ImageView ivPic,final String pic_url){

        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection();
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    Bitmap bitmap =BitmapFactory.decodeStream(is);
                    ivPic.setImageBitmap(bitmap);
                    is.close();
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
}

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button1"
        android:text="加载图片"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/ivPic"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="#dc0000"/>
</LinearLayout>

AndroidMainfest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="study_imageput.com.study_apktointent">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

最后显示结果就是白屏,如果之前设置了imageview的默认图片,加载之后就会变成白色

5个回答

Wei_Smile
Wei_Smile   2016.04.12 10:28
已采纳

你这个得用异步来做吧,我最近写了一个异步获取图片的Demo,主要部分是这么写的:

 public class MainActivity extends Activity implements OnClickListener {

    private ImageView iv;
    private Button downloadButton;
    private TextView tv_show;
    private RotatingDoughnut rotatingDoughnut;
    private static final String IMG_PATH = "http://img.my.csdn.net/uploads/201604/06/1459922240_8285.jpg";
    private static final int MSG_SUCCESS = 0;
    private static final int MSG_FAILURE = 1;
    private static final int MSG_START_LOADING = 3;
    private static final int MSG_FINISH_LOADING = 4;
    private DownloadThread downloadThread;
    private Bitmap bitmap = null;

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
        tv_show = (TextView) findViewById(R.id.tv_show);
        rotatingDoughnut = (RotatingDoughnut) findViewById(R.id.progressBar);
        downloadButton = (Button) findViewById(R.id.btn_download);
        downloadButton.setOnClickListener(this);
    } 

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) { 

            switch (msg.what) { 
                case MSG_SUCCESS: 
                    rotatingDoughnut.setVisibility(View.INVISIBLE); 
                    iv.setImageBitmap(bitmap); 
                    downloadButton.setText("Success"); 
                    downloadButton.setEnabled(false); 
                    break; 
                case MSG_FAILURE: 
                    Toast.makeText(getApplicationContext(), "获取图片失败", Toast.LENGTH_SHORT).show(); 
                    downloadButton.setText("Failure"); 
                    downloadButton.setEnabled(false); 
                    break; 
                case MSG_START_LOADING: 
                    rotatingDoughnut.doughnutRotating(); 
                default: 
                    break; 
            } 
        } 

        ; 

    }; 


    private class DownloadThread extends Thread {
        HttpURLConnection coon;
        InputStream inputStream;

        @Override 
        public void run() { 
            try { 
                URL url = new URL(IMG_PATH);
                if (url != null) {
                    coon = (HttpURLConnection) url.openConnection();
                    coon.setConnectTimeout(2000);
                    coon.setDoInput(true);
                    coon.setRequestMethod("GET");
                    coon.connect();
                    if (coon.getResponseCode() == 200) {
                        inputStream = coon.getInputStream();
                        bitmap = BitmapFactory.decodeStream(inputStream);
                        mHandler.obtainMessage(MSG_SUCCESS).sendToTarget();
                    } else { 
                        mHandler.obtainMessage(MSG_FAILURE).sendToTarget();
                    } 
                } 

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block 
                e.printStackTrace();
            } 
            super.run(); 
        } 


    } 

    @Override 
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_download:
                iv.setImageBitmap(null);
                downloadThread = new DownloadThread();
                if (!isConnectingToInternet()) { 
                    Toast.makeText(getApplicationContext(), "未检测到网络", Toast.LENGTH_SHORT).show();
                } else { 
                    tv_show.setVisibility(View.GONE);
                    rotatingDoughnut.setVisibility(View.VISIBLE);
                    mHandler.obtainMessage(MSG_START_LOADING).sendToTarget();
                    mHandler.postDelayed(new Runnable() {
                        @Override 
                        public void run() { 
                            downloadThread.start();
                        } 
                    }, 2500); 
                } 
                break; 
            default: 
                break; 
        } 

    } 

    /** 
     * 检测网络状态 
     * 
     * @return 
     */ 
    public boolean isConnectingToInternet() { 
        ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (int i = 0; i < info.length; i++)
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true; 
                    } 

        } 
        return false; 
    } 

} 

你参考参考

void_1912
void_1912 回复李牧羊: 谢谢
一年多之前 回复
Wei_Smile
Wei_Smile 项目地址在这:https://github.com/GiitSmile/HandlerDownload
一年多之前 回复
CSDNXIAON
CSDNXIAON   2016.04.12 10:34

android使用ImageView加载本地SdCard图片和加载网络图片
android使用ImageView加载本地SdCard图片和加载网络图片
Android - 小功能 使用ImageView加载本地SdCard图片和加载网络图片
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

qq_31421225
qq_31421225   2016.04.12 11:07

图片的话 目前我是用ImageLoader做的 效果还不错 你可以试试

QUBUBING
QUBUBING   2016.04.12 12:22

是不是被android:src="#dc0000"挡住了?

void_1912
void_1912 不会的,是Thread的start方法没有写进去
一年多之前 回复
crazy1235
crazy1235   Ds   Rxr 2016.04.14 11:16

图片下载显示要异步操作。
并且只能在UI线程中才能操作UI

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!