gpt4 book ai didi

Android 从 URL 加载到位图 #2

转载 作者:行者123 更新时间:2023-11-29 14:52:27 25 4
gpt4 key购买 nike

根据以下答案,我无法从 Android 上的 url 加载位图:https://stackoverflow.com/a/8993175/1062794

我已将案例简化到绝对最低限度:

public void loadBitmap(View view) {
Bitmap b = getBitmapFromURL("http://upload.wikimedia.org/wikipedia/en/7/70/Example.png");
}

public Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

我已在 list 中启用互联网访问(我相信):

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

当我运行该应用程序时,它在尝试运行 connection.connect() 时崩溃并显示 null 详细信息。单步执行我看到它试图从 StrictMode.class 中抛出这个错误:

if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
throw new NetworkOnMainThreadException();
}

这是我尝试制作 Android 应用程序的第一天,所以我可能会犯一个明显的错误。我正在使用模拟器和 Win7。

最佳答案

从 Android 3.0 开始,同步操作不能再直接从 UI 线程运行。如果您尝试在您的 onCreate() 方法中直接调用 loadBitmap(View view) 方法,您的应用程序在运行 Android 3.0 及更高版本的设备上运行时将崩溃。因为 loadBitmap() 方法是同步的——也就是说,它不会返回控制直到图像被下载——直接调用它会卡住你的 Activity 的用户界面。这在 Android 3.0 及更高版本中是不允许的;所有同步代码必须使用AsyncTask 类包装。使用 AsyncTask 使您能够在单独的线程中执行后台任务,然后在 UI 线程中返回结果。这样,您就可以执行后台操作,而无需处理复杂的线程问题。要异步调用 loadBitamp() 方法,您需要将代码包装在 AsyncTask 类的子类中,如下所示:

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return getBitmapFromUrl(urls[0]);
}
protected void onPostExecute(Bitamp result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}

现在在 onCreate() 方法中创建一个 AsyncTask 类的新实例并执行它:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new DownloadImage().execute("http://upload.wikimedia.org/wikipedia/en/7/70/Example.png");
}

关于Android 从 URL 加载到位图 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com