获取远程图片导致android中的NetworkOnMainThreadException
首先,对不起,我的英语很差 我正在尝试创建一个简单的android应用程序,使用官方的Facebook API连接到Facebook。当用户登录并授权我的应用程序时,我想获取他/她的用户名和个人资料图片,然后显示在我的应用程序中。我采用了Facebook API附带的Hackbook示例应用程序中的一些代码。这是我在主活动类中的代码获取远程图片导致android中的NetworkOnMainThreadException,android,facebook,get,image,Android,Facebook,Get,Image,首先,对不起,我的英语很差 我正在尝试创建一个简单的android应用程序,使用官方的Facebook API连接到Facebook。当用户登录并授权我的应用程序时,我想获取他/她的用户名和个人资料图片,然后显示在我的应用程序中。我采用了Facebook API附带的Hackbook示例应用程序中的一些代码。这是我在主活动类中的代码 public class SocialApp2Activity extends Activity { private Handler handler;
public class SocialApp2Activity extends Activity {
private Handler handler;
private Facebook facebook;
private AsyncFacebookRunner asyncRunner;
private TextView text;
private ImageView imgUserPic;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler = new Handler();
text = (TextView) findViewById(R.id.txt);
imgUserPic = (ImageView) findViewById(R.id.user_pic);
facebook = new Facebook("MY_FB_APP_ID");
asyncRunner = new AsyncFacebookRunner(facebook);
facebook.authorize(this, new DialogListener() {
@Override
public void onComplete(Bundle values) {
Bundle params = new Bundle();
params.putString("fields", "name, picture");
asyncRunner.request("me", params, new UserRequestListener());
}
...
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}
/* Callback for fetching username and profile picture */
public class UserRequestListener implements RequestListener {
@Override
public void onComplete(final String response, final Object state) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(response);
final String picURL = jsonObject.getString("picture");
final String name = jsonObject.getString("name");
handler.post(new Runnable() {
@Override
public void run() {
text.setText(name);
/********************************
*** This line cause an error ***
********************************/
imgUserPic.setImageBitmap(Utility.getBitmap(picURL));
}
});
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
...
}
}
调用自己的方法从远程服务器读取配置文件图片的位图数据时出错。错误是NetworkOnMainThreadException,这里有一些堆栈跟踪
05-04 14:37:28.898: W/System.err(1117): android.os.NetworkOnMainThreadException
05-04 14:37:28.905: W/System.err(1117): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
05-04 14:37:28.905: W/System.err(1117): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
...
05-04 14:37:29.005: W/System.err(1117): at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:164)
05-04 14:37:29.005: W/System.err(1117): at promlert.socialapp2.Utility.getBitmap(Utility.java:26)
05-04 14:37:29.016: W/System.err(1117): at promlert.socialapp2.SocialApp2Activity$UserRequestListener$1.run(SocialApp2Activity.java:95)
...
你能告诉我如何解决这个问题吗。谢谢处理程序。post(Runnable Runnable)正在UI线程上执行Runnable。因此,如果您试图在UI线程上执行网络操作,则会出现此异常。要避免这种情况:首先调用实用程序.getBitmap(picURL),而不是从UI线程调用,然后在UI线程上仅发布imgUserPic.setImageBitmap()方法:
post(Runnable Runnable)正在UI线程上执行Runnable。因此,如果您试图在UI线程上执行网络操作,则会出现此异常。要避免这种情况:首先调用实用程序.getBitmap(picURL),而不是从UI线程调用,然后在UI线程上仅发布imgUserPic.setImageBitmap()方法:
Utility
类是internal.facebook.Utility
,对吗?它说它没有像getBitmap
@rockydgeekgod:yes这样的功能。至少在发帖的时候,实用程序
类是internal.facebook.Utility
,对吗?它说它没有像getBitmap
@rockydgeekgod:yes这样的功能。至少是在发帖的时候
new Thread(new Runnable() {
@Override
public void run() {
//this line must be called not from the UI thread
final Bitmap bitmap = Utility.getBitmap(picURL)
handler.post(new Runnable() {
@Override
public void run() {
text.setText(name);
imgUserPic.setImageBitmap(bitmap );
}
});
}
}).start();