1

可能重复:
android.os.NetworkOnMainThreadException

我正在尝试为 android 构建一个 RSS 阅读器。这是我的代码。我收到错误消息说无法在线程上执行网络操作。

URL url = null;
try {
url = new URL((data.get(position).getThumbnail()));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream content = null;
try {
content = (InputStream)url.getContent();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Drawable d = Drawable.createFromStream(content , "src"); 
Bitmap mIcon1 = null;
try {
mIcon1 =
BitmapFactory.decodeStream(url.openConnection().getInputStream());
} catch (IOException e) {
e.printStackTrace();
}

详细信息:API 是 16 我正在使用 XP pro ,SP3。安卓操作系统:果冻豆

这是我的 logcat 错误: http://pastebin.com/9wyVpNHV

4

3 回答 3

3

正确的。从 Android 4.0(或者可能是 4.1)开始,如果您在主应用程序线程上执行网络 I/O,您将​​自动失败。请将上面的代码移动到后台线程,例如AsyncTask.

于 2012-10-24T18:38:13.403 回答
2

使用线程和处理程序在 UI 线程和其他线程之间轻松交换数据

//Handler to send commands to UI thread
    Handler handler = new Handler();

    Thread th = new Thread(new Runnable() {
        public void run() {

            URL url = null; 
            InputStream content = null;
            try { 
                url = new URL((data.get(position).getThumbnail())); 

                content = (InputStream)url.getContent();
                Drawable d = Drawable.createFromStream(content , "src");  
                final Bitmap mIcon1 = BitmapFactory.decodeStream(url.openConnection().getInputStream());; 

                handler.post(new Runnable() {

                    public void run() {
                        //here you can do everything in UI thread, like put the icon in a imageVew
                    }
                });

            } catch (Exception e) { 
                e.printStackTrace();
                handler.post(new Runnable() {

                    public void run() {
                        Toast.makeText(YourActivityName.this, e.getMessage(), Toast.LENGTH_LONG);
                    }
                });
            } 


        }
    });
    th.start();
于 2012-10-24T18:54:10.053 回答
0

如前所述,最新的 API 网络操作应该在单独的线程中完成,否则它们会引发异常。以下是开发者网站上的一些示例:

在单独的线程上执行网络操作

于 2012-10-24T18:53:31.253 回答