2014-08-30 4 views
1

У меня есть базовый класс загрузчика , где я загружаю и декодирую растровое изображение. , но если я попытаюсь декодировать этот класс, я получаю свой bitmap = null.потеря данных в классах

public void add_item(String _txt, String _url) { 
    try { 
     Downloader dw = new Downloader(_url, context); 
     InputStream s = dw.execute().get(); 
     Bitmap b = BitmapFactory.decodeStream(s); // <<<<<< bitmap is null 
     bmp.add(b); 
    } catch (ExecutionException e) { Toast.makeText(this.context, "Ошибка загрузки картинки", Toast.LENGTH_SHORT).show(); } 
     catch (InterruptedException e) { Toast.makeText(this.context, "Ошибка загрузки картинки", Toast.LENGTH_SHORT).show(); } 
} 

downloader.java

package com.example.john.weather; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class Downloader extends AsyncTask<Void, Void, InputStream> { 

String url; 
Context mContext; 

public Downloader(String _url, Context _context){ 
    this.url = _url; 
    this.mContext = _context; 
} 

@Override 
protected InputStream doInBackground(Void... params) { 
    InputStream s; 
    try{ 
     s = download(this.url); 
     //Bitmap b = BitmapFactory.decodeStream(s); // <<<<<< Bitmap is good 
     return s; 
    } 
    catch (MalformedURLException e) { 
     Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); 
     return null; } 
    catch (IOException e){ 
     Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); 
     return null; 
    } 
} 

private InputStream download(String url) throws IOException { 
    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    return input; 
} 

} 

У меня есть базовый класс загрузчик , где я могу скачать и декодирования растрового изображения, а также. , но если я попытаюсь декодировать этот класс, я получаю свой bitmap = null.

+0

как вы декодируете из этого класса? – eldjon

+0

Bitmap b = BitmapFactory.decodeStream (s); – user3017844

ответ

0

Да, просто найдите решение. InputStream перемещается в байт [], а затем возвращается. Так расшифровывает можно сделать

byte[] data = dw.execute().get(); 
Bitmap b = BitmapFactory.decodeByteArray(data,0,data.length); 

downloader.java

package com.example.john.weather; 

import android.content.Context; 
import android.os.AsyncTask; 
import android.widget.Toast; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class Downloader extends AsyncTask<Void, Void, byte[]> { 

String url; 
Context mContext; 

public Downloader(String _url, Context _context){ 
    this.url = _url; 
    this.mContext = _context; 
} 

@Override 
protected byte[] doInBackground(Void... params) { 
    InputStream s; 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    try{ 
     s = download(this.url); 

     /*s.available() can be used only for small downloaded files 
     Returns an estimated number of bytes that can be read or skipped without blocking for more input. 
     Note that this method provides such a weak guarantee that it is not very useful in practice....*/ 
     byte[] data = new byte[s.available()]; 
     int n; 
     while ((n = s.read(data, 0, data.length)) != -1) { 
      buffer.write(data, 0, n); 
     } 
     buffer.flush(); 

     return buffer.toByteArray(); 
    } 
    catch (MalformedURLException e) { 
     Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); 
     return null; } 
    catch (IOException e){ 
     Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); 
     return null; 
    } 
} 

@Override 
protected void onPostExecute(byte[] result) { 

} 

private InputStream download(String url) throws IOException { 
    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    return input; 
} 

} 

UPD. Более стабильное преобразование в байт []

@Override 
protected byte[] doInBackground(Void... params) { 
    InputStream input; 
    try{ 
     input = download(this.url); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024]; 
     int length = 0; 
     while ((length = input.read(buffer)) != -1) { 
      baos.write(buffer, 0, length); 
     } 
     return baos.toByteArray(); 
    } 
    catch (MalformedURLException e) { Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); return null; } 
    catch (IOException e){ Toast.makeText(mContext, "Ошибка загрузки "+url, Toast.LENGTH_SHORT).show(); return null; } 
} 
0

Скорее всего, проблема в классе Downloader в методе download(). Вам необходимо загрузить содержимое потока, прежде чем перемещать выполнение в другой поток (который в этом случае является основным потоком)

+0

команда dw.execute() даст результат, который вы сказали. Но команда dw.execute(). Get() ждет, пока поток полностью не будет выполнен. – user3017844

+0

Вы можете попробовать декодировать растровое изображение на postExecute()? – eldjon

+0

просто попробовал, результат NULL. @Override protected void onPostExecute (результат InputStream) { Bitmap b = BitmapFactory.decodeStream (результат); b.getWidth(); } – user3017844