0

非同期タスクを使用して、インターネットからダウンロードした画像をデコードしようとしています。問題は、画像が読み込まれる場合と読み込まれない場合があることです。URL 上の画像は常に存在します。

これが私の非同期タスクです:

private class JSONIconWeatherTask extends AsyncTask<String, Void, byte[]> {

    @Override
    protected byte[] doInBackground(String... params) {

        byte[] data = null;

        try {
            // Let's retrieve the icon
            data = ( (new WeatherHttpClient()).getImage(params[0]));

        } catch (Exception e) {             
            e.printStackTrace();
        }

        return data;
}

@Override
    protected void onPostExecute(byte[] data) {         
        super.onPostExecute(data);

        if (data != null) {
            Bitmap img = BitmapFactory.decodeByteArray(data, 0, data.length);
            iconWeather.setImageBitmap(img);
        }
    }

}

そして、ここに私のログがあります:

09-29 15:53:14.590: W/System.err(14373): java.net.ConnectException: /127.0.0.1 (ポート 81) への接続に失敗しました: 接続に失敗しました: ECONNREFUSED (接続が拒否されました) 09-29 15: 53:14.590: W/System.err(14373): libcore.io.IoBridge.connect(IoBridge.java:114) で 09-29 15:53:14.590: W/System.err(14373): java.net で.PlainSocketImpl.connect(PlainSocketImpl.java:192) 09-29 15:53:14.590: W/System.err(14373): java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 09-29 15:53 :14.590: W/System.err(14373): java.net.Socket.connect(Socket.java:842) 09-29 15:53:14.590: W/System.err(14373): libcore.net で。 http.HttpConnection.(HttpConnection.java:76) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpConnection.(HttpConnection.java:50) 09-29 15: 53:14.590: W/System.err(14373): libcore.net.http で。HttpConnection$Address.connect(HttpConnection.java:340) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 09-29 で15:53:14.590: W/System.err(14373): libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpEngine.connect(HttpEngine.java: 311) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 09-29 15:53:14.590: W/システム。 err(14373): libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpURLConnectionImpl.getResponse で(HttpURLConnectionImpl.java:282) 09-29 15:53:14.590: W/System.err(14373): libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 09-29 15:53:14.590: W/ System.err(14373): com.example.weatherforecast.WeatherHttpClient.getImage(WeatherHttpClient.java:116) 09-29 15:53:14.590: W/System.err(14373): com.example.weatherforecast.MainActivity で$JSONForecastWeatherTask.doInBackground(MainActivity.java:187) 09-29 15:53:14.590: W/System.err(14373): com.example.weatherforecast.MainActivity$JSONForecastWeatherTask.doInBackground(MainActivity.java:1) 09- 29 15:53:14.590: W/System.err(14373): android.os.AsyncTask$2.call(AsyncTask.java:287) 09-29 15:53:14.590: W/System.err(14373): java.util.concurrent.FutureTask.run(FutureTask.java:234) 09-29 15:53:14.590: W/System.err(14373): android.os で。AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 09-29 15:53:14.590: W/System.err(14373): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) で 09- 29 15:53:14.600: W/System.err(14373): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 09-29 15:53:14.600: W/System.err( 14373): java.lang.Thread.run(Thread.java:856) 09-29 15:53:14.600: W/System.err(14373): 原因: libcore.io.ErrnoException: 接続に失敗しました: ECONNREFUSED (接続が拒否されました) 09-29 15:53:14.600: W/System.err(14373): libcore.io.Posix.connect(ネイティブ メソッド) 09-29 15:53:14.600: W/System.err(14373) : libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 09-29 15:53:14.600: W/System.err(14373): libcore.io.IoBridge.connectErrno(IoBridge.java:127) 09 -29 15:53:14.600: システムあり。エラー (14373): libcore.io.IoBridge.connect (IoBridge.java:112) で

4

1 に答える 1

0

「接続が拒否されました」とは、接続しようとしているサーバー (ここでは localhost) が、接続しようとしているポート (ここでは 81) をリッスンしていないことを意味します。

localhost という名前は、コードが実行されるデバイス、つまり Android デバイスまたはエミュレーターを指します。同じデバイスのポート 81 で接続を受け入れるアプリケーションも実行していない限り、間違ったアドレスに接続しています。

開発マシンでサーバーを実行していて、エミュレーターからそこに接続しようとする場合は、localhost の代わりに 10.0.2.2 を使用する必要があります。AndroidクライアントでコンピューターのIPアドレスを使用する代わりに、10.0.2.2を使用してローカルWebサーバーに接続する理由をご覧ください

于 2013-09-29T11:23:58.910 に答える