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 を使用しています。Android OS: ジェリービーン

ここに私の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 に答える