-1

これは、画像をロードするための単純な関数です。Android 2.2 では問題なく動作しますが、Android 4 の画像をダウンロードして表示することはありません。これは作成時のコードです:

Bitmap bitmap = DownloadImage(weather.icon);
holder.imgIcon.setImageBitmap(bitmap);

ホルダーは正常に動作します/これが機能です:

    private InputStream OpenHttpConnection(String urlString) throws IOException {
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection))
        throw new IOException("Not an HTTP connection");

    try {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        response = httpConn.getResponseCode();
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();
        }
    } catch (Exception ex) {
        throw new IOException("Error connecting");
    }
    return in;
}

private Bitmap DownloadImage(String URL) {
    Bitmap bitmap = null;
    InputStream in = null;

    try {
        in = OpenHttpConnection(URL);
        BufferedInputStream bis = new BufferedInputStream(in, 8190);

        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
            baf.append((byte) current);
        }
        byte[] imageData = baf.toByteArray();
        bitmap = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length);
        in.close();
    } catch (IOException e1) {

        e1.printStackTrace();
    }
    return bitmap;
}

誰か助けてくれませんか、疲れました。ありがとう

4

3 に答える 3

1

あなたはNetwork Rquestmain で実行していますUI thread

Network Requestandroid>=3.0 では、メイン UI スレッドで実行できません。使用する必要があります

ネットワーク操作を行うAsyncTask。(画像をダウンロードするには、あなたの場合)

于 2012-12-05T12:59:46.930 に答える
0

クラスに追加します。

Android HoneycombStrictModeが有効になっている場合は、オフにします。

Async Taskネットワーク操作に使用します。

また

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

これを読んでください:
https://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

于 2012-12-05T13:05:52.097 に答える
0
private class DownloadFile extends AsyncTask<String, Integer, String> {
ProgressDialog mProgressDialog;

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create progress dialog
        mProgressDialog = new ProgressDialog(Your Activity.this);
        // Set your progress dialog Title
        mProgressDialog.setTitle("title");
        // Set your progress dialog Message
        mProgressDialog.setMessage(" message");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // Show progress dialog
        mProgressDialog.show();
    }

@Override
protected String doInBackground(String... Url) {
    String filename = "image.jpg";
    try {
        URL url = new URL(mStrings[curruntPosition]);
        URLConnection connection = url.openConnection();
        connection.connect();

        // Detect the file length
        int fileLength = connection.getContentLength();

        // Locate storage location
        String filepath = Environment.getExternalStorageDirectory()
                .getPath();

        // Download the file
        InputStream input = new BufferedInputStream(url.openStream());

        // Save the downloaded file
        OutputStream output = new FileOutputStream(filepath + "/"
                + filename);

        // String fileName = "picss.jpg";

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            // Publish the progress
            publishProgress((int) (total * 100 / fileLength));
            output.write(data, 0, count);
        }

        // Close connection
        output.flush();
        output.close();
        input.close();

    } catch (Exception e) {
        // Error Log
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onProgressUpdate(Integer... progress) {
    super.onProgressUpdate(progress);
    // Update the progress dialog
    mProgressDialog.setProgress(progress[0]);
    // Dismiss the progress dialog
    mProgressDialog.dismiss();

}

}

次に、アクティビティのダウンロード ボタンに次のコードを入力します。

new DownloadFile().execute(your url);
于 2013-09-04T06:04:19.633 に答える