从服务器下载一堆文件时出错

时间:2013-07-09 07:27:24

标签: android web-services android-asynctask threadpoolexecutor

我正在尝试使用AsynchTask从服务器中收集大量文件,我收到此错误:

07-09 12:49:57.868: E/AndroidRuntime(11133): java.lang.ExceptionInInitializerError
07-09 12:49:57.868: E/AndroidRuntime(11133): Caused by: java.lang.NullPointerException

它引发了我的注意:

public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, null, null);

我不知道什么问题.. 我的代码

package com.soch.webservice;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

import android.app.Service;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;

import com.soch.database.Database_Handler;

public class FileTransferService extends Service {

    private static final int CORE_POOL_SIZE = 2;
    private static final int MAXIMUM_POOL_SIZE = 5;
    private static final int KEEP_ALIVE = 1;

    public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, null, null);

    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()) {

                try {

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

                } catch (Exception e) {     

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

            }

        }

        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 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);
                FileNo += 1;
                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);
                FileNo += 1;
                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 + "%");
                FileNo += 1;
            } 
        }
    }

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

被修改

private static final int CORE_POOL_SIZE = 2;
private static final int MAXIMUM_POOL_SIZE = 5;
private static final int KEEP_ALIVE = 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(3);

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

1 个答案:

答案 0 :(得分:1)

documentation您可以看到返回值:

  

抛出:IllegalArgumentException - 如果是corePoolSize或keepAliveTime   小于零,或者如果maximumPoolSize小于或等于零,或者   如果corePoolSize大于maximumPoolSize。空指针异常 -   如果workQueue为null

因此,workQueue不能为空