You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AsyncTask加载网络图片致App崩溃求助(Android新手)

解决你的Android图片加载崩溃问题

嘿,我来帮你排查这个崩溃问题!你的代码里有几个关键问题导致点击按钮后App崩溃,咱们一个个解决:

1. 错误使用AsyncTask.get()阻塞主线程

你在主线程里调用了myTask.execute(...).get(),这个方法会强制阻塞主线程直到异步任务完成。Android主线程被阻塞超过一定时间就会触发ANR(应用无响应),甚至直接崩溃。AsyncTask的正确用法是重写onPostExecute方法,在这个方法里更新UI——因为它是在主线程执行的。

2. 缺少网络权限

你的App要访问网络加载图片,必须在AndroidManifest.xml中声明网络权限,否则网络请求会失败,抛出异常导致崩溃。

3. 不完善的资源释放与异常处理

你的代码里没有关闭网络连接的InputStream,可能造成资源泄漏;而且如果图片加载失败返回null,直接设置到ImageView也会引发问题。


修正后的完整代码

MainActivity.java

public class MainActivity extends AppCompatActivity {
    ImageView mImageView;

    public void clickButton(View view) {
        Log.d("Process", "Button pressed");
        ImageDownloader myTask = new ImageDownloader();
        myTask.execute("https://ichef.bbci.co.uk/news/410/media/images/47104000/jpg/_47104670_homer_226other.jpg");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = findViewById(R.id.mImageView);
    }

    public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(String... urls) {
            HttpURLConnection connection = null;
            InputStream myStream = null;
            try {
                URL url = new URL(urls[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                myStream = connection.getInputStream();
                return BitmapFactory.decodeStream(myStream);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                // 释放资源,避免内存泄漏
                if (myStream != null) {
                    try {
                        myStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            // 只在Bitmap不为null时设置到ImageView,避免空指针
            if (result != null) {
                mImageView.setImageBitmap(result);
            } else {
                // 加载失败可以设置一张占位图或者提示
                mImageView.setImageResource(R.drawable.ic_error_placeholder);
            }
        }
    }
}

AndroidManifest.xml(添加权限)

在<application>标签外面添加网络权限声明:

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

额外建议

现在Android已经废弃了AsyncTask,推荐你使用更现代的方案:

  • 用Kotlin协程(如果用Kotlin开发)或者ExecutorService来处理异步任务
  • 直接使用成熟的图片加载库,比如Glide、Picasso,它们会帮你处理缓存、线程管理、异常处理等所有细节,一行代码就能完成图片加载,比自己写AsyncTask稳定得多。

内容的提问来源于stack exchange,提问作者HoLoGram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:22:43