Невозможно сохранить данные в txt в asynctask цикла

Я пытаюсь сохранить все выходные данные в asynctask для каждого HTTP-вызова. Но я не могу видеть какие-либо данные в файле. Я действительно ценю любую помощь. Спасибо в Advance.

final String[] ar={"1","2","3",.............,"25"} filename="test_file"; myFile = new File("/sdcard/"+filename); try { myFile.createNewFile(); fOut = new FileOutputStream(myFile); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } myOutWriter = new OutputStreamWriter(fOut); for ( j = 0; j < ar.length; j++) { u="http://www.example.com/"+ar[j]; JSONParser jParser=new JSONParser(); new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,u); } try { myOutWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class MyAsyncTask extends AsyncTask<string, string,="" void=""> { private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); InputStream inputStream = null; String result = ""; protected void onPreExecute() { progressDialog.setMessage("Downloading your data..."); progressDialog.show(); progressDialog.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface arg0) { MyAsyncTask.this.cancel(true); } }); } @Override protected Void doInBackground(String... params) { String url_select = params[0]; try { HttpClient httpclient = new DefaultHttpClient(); HttpResponse httpResponse = httpclient.execute(new HttpGet(url_select)); // receive response as inputStream inputStream = httpResponse.getEntity().getContent(); // // // Read content & Log // inputStream = httpEntity.getContent(); } catch (UnsupportedEncodingException e1) { Log.e("UnsupportedEncodingException", e1.toString()); e1.printStackTrace(); } catch (ClientProtocolException e2) { Log.e("ClientProtocolException", e2.toString()); e2.printStackTrace(); } catch (IllegalStateException e3) { Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); } catch (IOException e4) { Log.e("IOException", e4.toString()); e4.printStackTrace(); } // Convert response to string using String Builder try { BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); StringBuilder sBuilder = new StringBuilder(); String line = null; while ((line = bReader.readLine()) != null) { sBuilder.append(line + "\n"); } inputStream.close(); result = sBuilder.toString(); } catch (Exception e) { Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString()); } return null; } // protected Void doInBackground(String... params) protected void onPostExecute(Void v) { //parse JSON data try{ JSONObject jArray = new JSONObject(result); String name = jArray.getString("name"); if (name!=null) { Log.w("idname", name);
// myOutWriter.append(name).append("\r\n");
// Toast.makeText(getBaseContext(), name, 5).show(); } // End Loop this.progressDialog.dismiss(); } catch (JSONException e) { Log.e("JSONException", "Error: " + e.toString()); } // catch (JSONException e) catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // protected void onPostExecute(Void v) } //class MyAsyncTask extends AsyncTask</string,>
2 ответа

for ( j = 0; j < ar.length; j++) { u="http://www.example.com/"+ar[j]; JSONParser jParser=new JSONParser(); new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,u); } try { myOutWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

Вы закрываете myOutWriter после запуска MyAsyncTask. Поэтому, когда MyAsyncTask пытается записать данные в файл, он бросает OutputStreamWriter как исключение.

Здесь вы должны удалить код close myOutWriter. Добавить добавить закрытый код в конец onPostExecute, как показано ниже:

void onPostExecute(Void v) { ..... } catch (JSONException e) { Log.e("JSONException", "Error: " + e.toString()); } // catch (JSONException e) catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } int count = taskCount.decrementAndGet() if(count == 0 ) { try { myOutWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // protected void onPostExecute(Void v)

определение taskCount выглядит так:

AtomicInteger taskCount = new AtomicInteger(ar.length - 1);

Наконец, я думаю, что Thread и CountDownLatch - лучший вариант


проверьте, не суще ствует ли объект, а затем напишите на db

HttpEntity entity = response.getEntity();
if(entity!=null ){ inputStream = entity.getContent();
}

licensed under cc by-sa 3.0 with attribution.