2015-06-16 3 views
-1

Мне нужно загрузить все мои изображения с моего телефона на сервер, но проблема в том, что я запускаю память с помощью Async.OutofMemory Android BitMap

Я видел много решений, где они просят пользователя сделать изображение меньше, но мне нужно, чтобы исходное изображение отправлялось не сжимать и не модифицировать.

Я попытался использовать Thread.sleep (5000);

Я также попытался следующие, но проблема это очистка моего Bitmap, прежде чем она загружена, так как это асинхронная

bm.recycle(); bm = null;

Есть в любом случае я могу загрузить изображение ONE BY ONE

 @Override 
     protected void onCreate(Bundle savedInstanceState) { 


    picturePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()+"/Camera/"; 
      Log.d("Files", "Path: " + picturePath); 
      File f = new File(picturePath); 
      File file[] = f.listFiles(); 
      Log.d("Files", "Size: " + file.length); 
      for (int i=0; i < file.length; i++) 
      { 
       Log.d("Files", "FileName:" + file[i].getName()); 

       // Image location URL 
       Log.e("Files", "----------------" + picturePath+file[i].getName()); 



     // Image 
        Bitmap bm = BitmapFactory.decodeFile(picturePath + file[i].getName()); 
        ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
bm.compress(Bitmap.CompressFormat.JPEG, 75, bao); 
        byte[] ba = bao.toByteArray(); 
        ba1 = Base64.encodeToString(ba, Base64.DEFAULT); 

        Log.d("Files", "Uploading"); 

        new uploadToServer().execute(); 

       } 

       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
      } 



    public class uploadToServer extends AsyncTask<Void, Void, String> { 


      protected void onPreExecute() { 
       super.onPreExecute(); 
      } 

      @Override 
      protected String doInBackground(Void... params) { 

       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("base64", ba1)); 
       nameValuePairs.add(new BasicNameValuePair("ImageName", System.currentTimeMillis() + ".jpg")); 
       try { 
        HttpClient httpclient = new DefaultHttpClient(); 
        HttpPost httppost = new HttpPost(URL); 
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
        HttpResponse response = httpclient.execute(httppost); 
        String st = EntityUtils.toString(response.getEntity()); 
        Log.v("Files", "In the try Loop" + st); 

       } catch (Exception e) { 
        Log.v("Files", "Error in http connection " + e.toString()); 
       } 
       return "Success"; 

      } 

      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 

      } 
     } 
+0

, какие именно линии причины Недостаточно памяти ? – AterLux

+0

Вы создаете растровое изображение под названием «bm», но вы ничего не делаете с ним ... вы в основном загружаете пустой массив байтов ... –

+5

Вы не должны декодировать растровое изображение вообще - вы хотите загрузить файл, не отображать изображение. Используйте BufferedInputStream, который обертывает FileInputStream с целевым файлом - метод read (byte [] buffer, int byteOffset, int byteCount) позволяет вам писать в кусок сети. – npace

ответ

1

Вы должны отправить свои данные на куски с помощью HttpURLConnection-х .setChunkedStreamingMode(1024);

увидеть это answer для примера

Смежные вопросы