0

Web API から画像を読み込もうとしているときに問題が発生しています。私はそれを行うことができますが、それらをオブジェクトのプロパティに入れようとするとクラッシュします。私が見つけることができる画像をASYNCロードする方法のすべての例を見てきましたが、オブジェクトではなく画像ビューに割り当てるものを見つけた人は誰でもいます。以下は私のソースの一部です。

呼び出しコードの例を次に示します

     Movie Example = new Movie();       
     DownloadImageTask task = new DownloadImageTask();
                String path = "http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original" + example.getProfile_path();
                example.setProfile(task.execute(path).get());

画像を取得するために使用する方法は次のとおりです

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    private ImageView bmImage;

    public DownloadImageTask() {
        this.bmImage = new ImageView(getActivity());
    }

    protected void onPreExecute() {

    }

    protected Bitmap doInBackground(String... urls) {
        try{
        URL url = new URL(urls[0]);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap result = BitmapFactory.decodeStream(input);
        return result;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    protected void onPostExecute(Bitmap result) {
        //set image of your imageview
        try {
            bmImage.setImageBitmap(result);
            //close

        } catch (Exception ex) {
            Log.e("ERROR", "can't assign image to view");
        }

    }
}

似たようなものが欲しいのですが、imageviewに割り当てる代わりに、それを呼び出したメソッドに画像を返します。

4

1 に答える 1

1

実際には、それを呼び出したメソッドに画像を返すことにはあまり意味がありません。このメソッドは、それ自体を一時停止して画像が読み込まれるのを待つ必要があり、画像を並行して読み込むという目的を無効にするからです。正確に何を達成しようとしていますか?

本当にやりたいのであれば、AsyncTask を次のように変更することで実現できると思います。

private class DownloadImageTask extends AsyncTask<String, Void, Void> {
    private ImageView bmImage;

    private boolean finished = false;
    private Bitmap resultingBitmap = null;

    protected Void doInBackground(String... urls) {
        try{
        URL url = new URL(urls[0]);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        resultingBitmap = BitmapFactory.decodeStream(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        finished = true;
    }

    public boolean isFinished() {
        return finished;
    }

    public Bitmap getResultingBitmap() {
        return resultingBitmap;
    }
}

呼び出し元のコードでは、次のようになります。

DownloadImageTask task = new DownloadImageTask();
String path = "http://d3gtl9l2a4fn1j.cloudfront.net/t/p/original" + example.getProfile_path();
while (!task.isFinished()) { } // this defeats the purpose of parallel execution
example.setProfile(task.execute(path).getResultingBitmap());

ただし、@ Brandon の回答で提案されているように、これを達成できます。

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    Example example;

    public DownloadImageTask(Example example) {
        this.example = example;
    }

    (...)

    protected void onPostExecute(Bitmap result) {
        example.setProfile(result);
    }
}
于 2013-05-31T23:19:06.363 に答える