0

チュートリアルを使用して、エミュレーターで機能するこの結果に到達しましたが、実際のAndroidデバイスでは機能しなくなります。

コードはここに記載されており、必要な他のすべてのAndroid権限が設定されています。インターネットと外部デバイスへの書き込みが設定されています。

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class main extends Activity {

    private final String PATH = "/mnt/sdcard/Pictures/";
    TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textView1);
        DownloadFromUrl(PATH + "dwnldimg.png");
        ImageView iv = (ImageView) findViewById(R.id.imageView1);
        Bitmap bmp = BitmapFactory.decodeFile(PATH  + "dwnldimg.png");
        iv.setImageBitmap(bmp);
    }
    public void DownloadFromUrl(String fileName) {
            try {
                    URL url = new URL("http://192.168.1.4/evilempire.jpg"); //you can write here any link
                    File file = new File(fileName);
                     long startTime = System.currentTimeMillis();
                    tv.setText("Starting download......from " + url);
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();;
                    conn.setDoInput(true);
                    conn.connect();
                    InputStream is = conn.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    /*
                     * Read bytes to the Buffer until there is nothing more to read(-1).
                     */
                    ByteArrayBuffer baf = new ByteArrayBuffer(50);
                    int current = 0;
                    while ((current = bis.read()) != -1) {
                            baf.append((byte) current);
                    }

                    FileOutputStream fos = new FileOutputStream(file);
                    fos.write(baf.toByteArray());
                    fos.close();
                    tv.setText("Download Completed in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
            } catch (IOException e) {
                 tv.setText("Error: " + e);
            }
    }

}
4

2 に答える 2

1

Prime libは役に立ちますが、Androidを学ぶには、AsyncTaskを知っている必要があります。Androidにはアクティビティが実行されるUIスレッドがあるため、Android OSをブロックする複雑な操作を行うと、強制終了がスローされます。したがって、知っておく必要があるのは、ダウンロードタスクや、最終的にUIスレッドをブロックする操作を実行する必要がある場合は、スレッドを使用する必要があるということです。簡単なAndroidのアプローチはAsyncTaskです。この簡単な例は、AsyncTaskを理解するためのガイドになると思います。 http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-07-13T14:15:57.667 に答える
0

まず、メインUIスレッドでネットワーク操作を実行します。これにより、3.0より前ではanrが発生し、3.0以降ではNetworkOnMainThreadExceptionが発生します。次に、リモートイメージのロードがはるかに簡単なPrimeを構築しました。

于 2012-07-13T13:57:14.330 に答える