2

PHP 서버에서 여러 파일을 다운로드하여 sdcard에 저장하려고합니다. 그러나 파일을 다운로드 할 때 다음 오류가 발생합니다 : No of files download from server is **500 -600** after download some files **250 - 260**. 그것은 오류를 제기했다.많은 파일을 서버에서 다운로드하십시오.

오류

07-10 08:40:46.228: E/File Error(1837): File id is 287 File path is http://192.168.1.21/SOCH/upload/chapter_36/5.9.pdf Synch Path is /mnt/sdcard/SOCH/36/ 
    07-10 08:40:46.268: W/System.err(1837): java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 128, active threads = 128, queued tasks = 128, completed tasks = 1] 
    07-10 08:40:46.268: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1967) 
    07-10 08:40:46.268: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:782) 
    07-10 08:40:46.268: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1303) 
    07-10 08:40:46.268: W/System.err(1837):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:589) 
    07-10 08:40:46.268: W/System.err(1837):  at com.soch.webservice.FileTransferService.onStartCommand(FileTransferService.java:146) 
    07-10 08:40:46.278: W/System.err(1837):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2490) 
    07-10 08:40:46.278: W/System.err(1837):  at android.app.ActivityThread.access$1900(ActivityThread.java:130) 
    07-10 08:40:46.278: W/System.err(1837):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
    07-10 08:40:46.278: W/System.err(1837):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    07-10 08:40:46.278: W/System.err(1837):  at android.os.Looper.loop(Looper.java:137) 
    07-10 08:40:46.278: W/System.err(1837):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
    07-10 08:40:46.278: W/System.err(1837):  at java.lang.reflect.Method.invokeNative(Native Method) 
    07-10 08:40:46.278: W/System.err(1837):  at java.lang.reflect.Method.invoke(Method.java:511) 
    07-10 08:40:46.278: W/System.err(1837):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    07-10 08:40:46.278: W/System.err(1837):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    07-10 08:40:46.278: W/System.err(1837):  at dalvik.system.NativeStart.main(Native Method) 
    07-10 08:40:46.278: E/File Error(1837): File id is 288 File path is http://192.168.1.21/SOCH/upload/chapter_37/6.1.pdf Synch Path is /mnt/sdcard/SOCH/37/ 
    07-10 08:40:46.308: W/System.err(1837): java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 128, active threads = 128, queued tasks = 128, completed tasks = 1] 
    07-10 08:40:46.308: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1967) 
    07-10 08:40:46.308: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:782) 
    07-10 08:40:46.308: W/System.err(1837):  at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1303) 
    07-10 08:40:46.308: W/System.err(1837):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:589) 
    07-10 08:40:46.308: W/System.err(1837):  at com.soch.webservice.FileTransferService.onStartCommand(FileTransferService.java:146) 
    07-10 08:40:46.308: W/System.err(1837):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2490) 
    07-10 08:40:46.308: W/System.err(1837):  at android.app.ActivityThread.access$1900(ActivityThread.java:130) 
    07-10 08:40:46.308: W/System.err(1837):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
    07-10 08:40:46.308: W/System.err(1837):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    07-10 08:40:46.308: W/System.err(1837):  at android.os.Looper.loop(Looper.java:137) 
    07-10 08:40:46.308: W/System.err(1837):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
    07-10 08:40:46.308: W/System.err(1837):  at java.lang.reflect.Method.invokeNative(Native Method) 
    07-10 08:40:46.308: W/System.err(1837):  at java.lang.reflect.Method.invoke(Method.java:511) 
    07-10 08:40:46.308: W/System.err(1837):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    07-10 08:40:46.308: W/System.err(1837):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    07-10 08:40:46.308: W/System.err(1837):  at dalvik.system.NativeStart.main(Native Method) 

는 아무도 나에게이 문제를 해결하는 데 도움이 수 있습니까? 나는 asynchtask를 사용하여 다운로드를하고있다.

내 코드

패키지 com.webservice이다;

public class FileTransferService extends Service { 

     private static final int CORE_POOL_SIZE = 1; 
    private static final int MAXIMUM_POOL_SIZE = 128; 
    private static final int KEEP_ALIVE = 128 ; 

    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(MAXIMUM_POOL_SIZE); 

    private static final ThreadFactory sThreadFactory = new ThreadFactory() { 
      private final AtomicInteger mCount = new AtomicInteger(1); 

      public Thread newThread(Runnable r) { 
       return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); 
      } 
     }; 


    public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue,sThreadFactory); 

      int FileNo = 0; 

      ArrayList<String> FileId = new ArrayList<String>(); 
      ArrayList<String> ServerPath = new ArrayList<String>(); 
      ArrayList<String> SynchPath = new ArrayList<String>(); 
      ArrayList<String> FileNameList = new ArrayList<String>(); 

      String FileTransferPath = "", SDcardPath = ""; 

      @Override 
      public void onCreate() { 
       super.onCreate(); 
       Log.d("Service Created", "Successfully"); 

       FileId.clear(); 
       ServerPath.clear(); 
       SynchPath.clear(); 
       FileNameList.clear(); 

       SDcardPath = Environment.getExternalStorageDirectory().getPath() + "/"; 

       // Get FileTransfer Link From The SD Card 
       ...... 

       // Getting A url From DB 

       ..... 

      }// End onCreate 

      @Override 
      public int onStartCommand(Intent intent, int flags, int startId) { 

       Log.d("Service Started", "Successfully"); 

       Log.d("fileSize",""+FileId.size()); 
         if (FileId.size() > 0) { 

        ContentValues mContentValuesUpdatefileStatus = new ContentValues(); 
        mContentValuesUpdatefileStatus.put("Status", 1); 

         while (FileNo < FileId.size()) { 

         dbh.updateRecord("Mst_FileTransfer",mContentValuesUpdatefileStatus,"FileTransferId",FileId.get(FileNo)); 

         try { 

          new DownloadFileFromURL().executeOnExecutor(THREAD_POOL_EXECUTOR,Integer.toString(FileNo));       
          //new DownloadFileFromURL().execute(Integer.toString(FileNo));     

         } catch (Exception e) {  
          e.printStackTrace(); 
          Log.e("File Error", " File id is " + FileId.get(FileNo) + " File path is " + ServerPath.get(FileNo) + " Synch Path is " + SynchPath.get(FileNo)); 
         } 

         FileNo +=1; 
        } 

       } 

       Log.d("Service Finish", "Successfully"); 
       stopSelf(); 

       return super.onStartCommand(intent, flags, startId); 
      } 

      class DownloadFileFromURL extends AsyncTask<String, String, String> { 

       int Count = 0; 
       int File_Completed = 0; 
       int FileNo; 
       String strServerPath,strSynchPath,strFileName; 

       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 

       } 

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

        FileNo = Integer.parseInt(params[0]); 

        // Get File Path 
        strServerPath = ServerPath.get(FileNo).replaceAll(" ", "%20"); 
        strSynchPath = SynchPath.get(FileNo); 
        strFileName = FileNameList.get(FileNo); 

        URLConnection mConnection = null; 

        Log.d("file", strSynchPath + strFileName); 

        File SynchPath = new File(strSynchPath); 
        if (!SynchPath.exists()) { 
         SynchPath.mkdirs(); 
        } 

        try { 

         URL url = new URL(strServerPath); 
         mConnection = url.openConnection(); 
         mConnection.connect(); 

         // getting file length 
         int lenghtOfFile = mConnection.getContentLength(); 

         // Output stream to write file 
         File outputFile = new File(SynchPath, strFileName); 
         FileOutputStream mFileOutputStream = new FileOutputStream(
           outputFile); 

         InputStream mInputStream = url.openStream(); 
         byte data[] = new byte[1024]; 

         long File_Completed_Size = 0; 

         while ((Count = mInputStream.read(data)) != -1) { 

          File_Completed_Size += Count; 
          File_Completed = (int) ((File_Completed_Size * 100)/lenghtOfFile); 

          // writing data to file 
          mFileOutputStream.write(data, 0, Count); 
         } 

         // flushing output 
         mFileOutputStream.flush(); 

         // closing streams 
         mFileOutputStream.close(); 
         mInputStream.close(); 

        } catch (IOException IO) { 

         Log.e("File Exception"," File id is " + FileId.get(FileNo) + " File path is " + strServerPath + " Synch Path is " + strSynchPath + "FileName " + strFileName); 
         IO.printStackTrace(); 

        } catch (Exception e) { 

         Log.e("File Exception"," File id is " + FileId.get(FileNo) + " File path is " + strServerPath + " Synch Path is " + strSynchPath + "FileName " + strFileName); 
         e.printStackTrace(); 
        } 
        return null; 
       } 

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

        if (File_Completed == 100) { 
         Log.d("File Downlode Status for " + SynchPath.get(FileNo), "" + File_Completed + "%"); 
        } 
       } 
      } 

      @Override 
      public IBinder onBind(Intent intent) { 
       return null; 
      } 
     } 
+0

몇 가지 코드를 공유 할 수 있습니까? – Bun

답변

1

무리가 문제입니다. 실행 프로그램 풀 한도를 초과했습니다. (블라인드 추측은 동시에 10 명이 넘는 경우입니다.) IntentServer을 순서대로 사용하거나 이미 지원하는 API를 타겟팅하는 경우 DownloadManager을 사용하십시오.

+0

나는 4.1에서 일하고있다. 그러나 쓰레드 풀 제한을하는 법을 모른다. 몇 가지 예를 들어 줄 수 있니? ... –

+0

정말 OS 제한을 높일 수는 없다. 버드 ** 정말로 ** 데이터를 병렬로 가져와야합니까? 꽤 의심 스럽습니다. 모바일에서는 그다지 빠르지 않을 것입니다. 'AsyncTask'을 제거하고 다운로드를 위해 IntentService를 사용하십시오. –

+0

제 경우에는 DownloadManager를 사용하여 파일을 다운로드 할 수 없습니다. 왜냐하면 내 사용자에게 시스템 액세스 권한을 부여하고 싶지 않기 때문입니다. 기본적으로 1을 개발 중입니다. 학교 응용 프로그램 및 내 응용 프로그램에서 사용자에게 시스템에 액세스 할 수있는 권리를 부여하지 오전 ... –

관련 문제