Невозможно сохранить данные в 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.