Android 5.0:Android.os.NetworkOnMainThread尝试获取位图对象时出现异常
当我编码我的android项目时,我需要加载一个带有URL的位图对象。 运行以下代码时引发异常:Android 5.0:Android.os.NetworkOnMainThread尝试获取位图对象时出现异常,android,android-asynctask,Android,Android Asynctask,当我编码我的android项目时,我需要加载一个带有URL的位图对象。 运行以下代码时引发异常: Bitmap bm = GetLoginUserInfoUtil.getBitmap(object.getString("profile_image_url")); 例外情况: 12-30 21:01:14.440: W/System.err(6025): android.os.NetworkOnMainThreadException 12-30 21:01:14.440: W/System.er
Bitmap bm = GetLoginUserInfoUtil.getBitmap(object.getString("profile_image_url"));
例外情况:
12-30 21:01:14.440: W/System.err(6025): android.os.NetworkOnMainThreadException
12-30 21:01:14.440: W/System.err(6025): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
以下是我的getBitmap方法:
public static Bitmap getBitmap(String biturl) {
Bitmap bitmap=null;
try {
URL url = new URL(biturl);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(new BufferedInputStream(in));
}
catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
我发现了一个关于android.os.NetworkOnMainThreadException的类似问题,最推荐的解决方案是使用AsyncTask
如何在我的类GetLoginUserInfoUtil中实现AsyncTask
编辑:
这是我加载位图文件的原始方法:
public static void reqUserInfo(final Oauth2AccessToken accessToken, long uid) {
user = new LoginUserInfo();
UsersAPI userapi = new UsersAPI(accessToken);
userapi.show(uid, new RequestListener() {
public void onComplete(String arg0) {
JSONObject object;
try {
object = new JSONObject(arg0);
Bitmap bm = GetLoginUserInfoUtil.getBitmap(object.getString("profile_image_url"));
GetLoginUserInfoUtil.user.setUserIcon(bm);
GetLoginUserInfoUtil.user.setIsDefault("0");
GetLoginUserInfoUtil.user.setToken(accessToken.getToken());
GetLoginUserInfoUtil.user.setUserName(object.getString("screen_name"));
}
catch (JSONException e) {
e.printStackTrace();
}
}
现在,我在类中添加了建议的异步任务:
private class GetBitmapTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return GetLoginUserInfoUtil.getBitmap(params[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
GetLoginUserInfoUtil.user.setUserIcon(result);
}
}
但我有一个错误:
No enclosing instance of type GetLoginUserInfoUtil is accessible. Must qualify the allocation with an enclosing instance of type
GetLoginUserInfoUtil (e.g. x.new A() where x is an instance of GetLoginUserInfoUtil).
包括这个。或者,更好的方法是使用许多异步加载图像的第三方库中的任何一个,例如或。与此主题相关的问题太多了。看到这一点,这本身将不起作用,因为它与程序流不同步(无法以原始方式“返回”位图)。这也是我的想法,我需要在获取对象后才开始获取位图,并从对象解释url。如何从这里开始异步任务?
No enclosing instance of type GetLoginUserInfoUtil is accessible. Must qualify the allocation with an enclosing instance of type
GetLoginUserInfoUtil (e.g. x.new A() where x is an instance of GetLoginUserInfoUtil).
private class GetBitmapTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return GetLoginUserInfoUtil.getBitmap(params[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
bm = result;
}
}
new GetBitmapTask(object.getString("profile_image_url")).execute();