2015-04-13 3 views
-3

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

У меня есть AsyncTask, который пытается сохранить некоторые данные в файл, размещенный на внутренней памяти устройства. Файл создается, но заполняется 0 байт

public void exportFile(final Context mContext, boolean debug) { 

    try { 
     final String path = Environment.getExternalStorageDirectory() 
       .getAbsolutePath() + "/DroidP"; 
     File dir = new File(path); 
     dir.mkdirs(); 

     final File file = new File(dir, "Droid_export.txt"); 

     if (file.exists()) { 
      file.delete();       
     } 

     file.createNewFile(); 

     final FileWriter out = new FileWriter(file,true); 



     final int totalLines = recordsIdList.size(); 
     new AsyncTask<Void, String, Void>() { 
      ProgressDialog progressDialog; 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       try { 



        List<byte[]> mainBuffer = new ArrayList<byte[]>(); 

        int i = 0; 
        int size = 0; 

        for (Integer r : recordsIdList) { 
         Log.i("test", db.getRecord(r).toExportSQL()); 

         byte[] buffer = db.getRecord(r).toExportSQL().getBytes(); 
         mainBuffer.add(buffer); 
         size += buffer.length; 

         publishProgress("Writing " + (i++) + " from "+ totalLines); 
        } 

        int pos = 0; 
        char[] outBuffer = new char[size]; 
        for(byte[] chunk : mainBuffer) { 
         for(i=0;i<chunk.length;i++) { 
          outBuffer[pos] = (char)chunk[i]; 
          pos++; 
         }       
        } 

        out.write(outBuffer); 

        out.flush(); 



       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     } 

      @Override 
      protected void onProgressUpdate(String... progress) { 
       progressDialog.setMessage(progress[0]); 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       try { 
        out.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       progressDialog.dismiss(); 
      } 

      @Override 
      protected void onPreExecute() { 
       progressDialog = ProgressDialog.show(mContext, 
         "Exporting file", "", true); 
      } 
     }.execute((Void) null); 
     Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     intent.setData(Uri.fromFile(file.getAbsoluteFile())); 
     sendBroadcast(intent); 
    } catch (Exception e) { 

    } 
} 

Когда я смотрю на журналы, я могу увидеть данные, которые я пытаюсь сохранить в файл, который является правильным, но после того, как AsyncTask завершит создание файла с 0 байтами. Я что-то упустил? Помните, я довольно новичок в программировании на Android.

+3

Я смущен. Вы хотите прочитать или написать файл? – Blackbelt

+0

Я пытаюсь написать некоторые SQL-запросы, сгенерированные из другого метода в файл. Через LogCat я могу видеть запросы, но они не записываются в файл. –

+3

Нет, вы этого не сделали - это может быть то, что вы хотите, но код, который вы отправили *, читает * из файла. Он не * пишет * к одному. –

ответ

2

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

попробовать что-то вроде этого:

private Boolean isExporting = false; 

public void exportFile(final Context mContext, boolean debug) { 
    if (!isExporting) { 
     isExporting = true; 
     new AsyncTask<Void, String, Void>() { 
      ProgressDialog progressDialog; 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       try { 
        // read data into byte array 
        final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        int i = 0; 
        for (Integer r : recordsIdList) { 
         byte[] buffer = db.getRecord(r).toExportSQL().getBytes(); 
         Log.i("test", new String(buffer)); 
         baos.write(buffer); 
         publishProgress("Writing " + (i++) + " from " + totalLines); 
        } 
        baos.close(); 
        // write data to file 
        final String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/DroidP"; 
        final File dir = new File(path); 
        dir.mkdirs(); 
        final File file = new File(dir, "Droid_export.txt"); 
        file.createNewFile(); 
        final FileOutputStream fos = new FileOutputStream(file); 
        fos.write(baos.toByteArray()); 
        fos.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onProgressUpdate(String... progress) { 
       progressDialog.setMessage(progress[0]); 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       isExporting = false; 
       progressDialog.dismiss(); 
      } 

      @Override 
      protected void onPreExecute() { 
       progressDialog = ProgressDialog.show(mContext, 
         "Exporting file", "", true); 
      } 
     }.execute(); 
    } 
} 
+0

Большое вам спасибо! Задача решена! Я дам вам награду, когда пройдёт 14 часов. –

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