【问题标题】:Get a remote picture cause NetworkOnMainThreadException in android在android中获取远程图片导致NetworkOnMainThreadException
【发布时间】:2012-05-04 09:20:42
【问题描述】:

首先,对不起我的英语不好。

我正在尝试创建一个使用官方 Facebook API 连接到 Facebook 的简单 Android 应用。当用户登录并授权我的应用程序时,我想获取他/她的用户名和头像,然后显示在我的应用程序中。我采用了 Facebook API 附带的 Hackbook 示例应用程序中的一些代码。这是我在主要活动类中的代码。

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)
...

您能否建议我如何解决此问题。谢谢

【问题讨论】:

    标签: android facebook get image


    【解决方案1】:

    handler.post(Runnable runnable) 正在 UI 线程上执行 runnable。所以如果你试图在 UI 线程上执行网络操作 - 你会得到这个异常。为了避免这种情况:首先不是从 UI 线程调用 Utility.getBitmap(picURL),然后只在 UI 线程上发布 imgUserPic.setImageBitmap() 方法:

    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();
    

    【讨论】:

    • Utility 类是 internal.facebook.Utility,对吗?它说它没有像getBitmap这样的功能
    • @rockydgeekgod:是的。至少是在发帖时
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多