0

だから私はこれにかなり慣れていないので、アプリがクラッシュし続けます。私はここでこのコードを見つけましたが、私の人生のためにそれを機能させることはできません. 私がやろうとしているのは、選択したファイルをダウンロードするだけで、ジョブ フォルダーのサブディレクトリにいないときに機能します。MySQL データベースからジョブ フォルダ名をダウンロードすると、正常に動作します。すべてのジョブには、写真、ドキュメント、その他のサブフォルダーがあります...ジョブ4131があるとします..そして4131内には次のものがあります..

4131/cdgjkg.png 4131/その他 4131/写真

そして photots の中に別の png があります。(4131/Photos/dioghg.png)。問題は、ベース 4131 メソッド内で png をダウンロードすると機能することです。エラーなし。Photots ディレクトリに入ってそのファイルをダウンロードしようとすると、大量の非同期エラーが発生します。以下はコードです。もっと見る必要がある場合はお知らせください。

new LoadAllJobs().execute();

    ListView lv = getListView();

    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String file = ((TextView)view).getText().toString();
            String current_dir = dir + "/" +  file;
            if(file.contains(".")){
                //download the file or view it
                try {
                    Log.d("Downloading ", file);
                    new FTPDownload().execute(file);  // <-----This is where I start the task to enter the FTPDownload, never to be seen again :(
                    Log.d("Success ", current_dir);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }

これは、リストを取得し、ファイルに「.」が含まれている場合にのみファイルをダウンロードしたチャンクです。(「.」文字はサーバー上でフォルダー名に使用できないため、簡単なごまかしになります)。

FTPDownload クラス

class FTPDownload extends AsyncTask<String, Integer, String> {
//public FTPClient client;

@Override
protected String doInBackground(String... filename) {
    try {
        System.out.println("Filename->: " + filename[0]);
        GetFileFTP("/" + filename[0], Environment.getExternalStorageDirectory() + "/Download/", filename[0]);
    }
    finally
    {
        //e.printStackTrace();
        Log.v("DONE: ", "All done!");
    }
    System.out.println("I HATE YOU.");  // <----- NEVER REACHES THIS LINE WHEN TRYING TO DOWNLOAD IN A SUBFOLDER
    return null;
}



    public void GetFileFTP(String srcFileSpec, String destpath, String destname) {
    FTPClient client = new FTPClient();
    Log.v("pathSpec: ", destpath);

    try {
        client.connect("xxxxxx");
        client.login("xxxxxx", "xxxxxx");

        client.enterLocalPassiveMode();
        client.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);

        InputStream input = client.retrieveFileStream(srcFileSpec);
        if(input != null) Log.v("GetFileFTP: ", "INPUT STREAM OPENED SUCCESSFULLY!");
        Log.v("File InputStream: ", srcFileSpec);

        File output_file = new File(destpath + destname);
        Log.v("OUTPUTFILE: ", destpath + destname);

        inputstreamcopy(input, output_file);

        /*try {
            //Log.e("Closing connection: ", client.toString());
            client.logout();
            client.disconnect();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
    }
    catch (IOException e) {
        Log.e("FTP", "Error Getting File");
        e.printStackTrace();
    }
}

    public static void inputstreamcopy(InputStream source, File destination){
        try {
            org.apache.commons.io.FileUtils.copyInputStreamToFile(source, destination);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

コンソール出力

04-08 15:10:05.010: D/Downloading(29309): login.php
04-08 15:10:05.010: D/Success(29309): 4131/Miscellaneous/login.php
04-08 15:10:05.010: I/System.out(29309): Filename->: login.php
04-08 15:10:05.020: V/pathSpec:(29309): /storage/emulated/0/Download/
04-08 15:10:06.010: V/File InputStream:(29309): /login.php
04-08 15:10:06.020: V/OUTPUTFILE:(29309): /storage/emulated/0/Download/login.php
04-08 15:10:06.030: V/DONE:(29309): All done!
04-08 15:10:06.030: W/dalvikvm(29309): threadid=11: thread exiting with uncaught exception (group=0x418f5930)
04-08 15:10:06.040: E/AndroidRuntime(29309): FATAL EXCEPTION: AsyncTask #1
04-08 15:10:06.040: E/AndroidRuntime(29309): java.lang.RuntimeException: An error occured while executing doInBackground()
04-08 15:10:06.040: E/AndroidRuntime(29309):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.lang.Thread.run(Thread.java:856)
04-08 15:10:06.040: E/AndroidRuntime(29309): Caused by: java.lang.NullPointerException
04-08 15:10:06.040: E/AndroidRuntime(29309):    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1792)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1512)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at com.example.tdsi.FTPDownload.inputstreamcopy(FTPDownload.java:70)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at com.example.tdsi.FTPDownload.GetFileFTP(FTPDownload.java:51)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at com.example.tdsi.FTPDownload.doInBackground(FTPDownload.java:21)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at com.example.tdsi.FTPDownload.doInBackground(FTPDownload.java:1)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-08 15:10:06.040: E/AndroidRuntime(29309):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-08 15:10:06.040: E/AndroidRuntime(29309):    ... 4 more
4

1 に答える 1

2

これはあなたの犯人です:

04-08 15:10:06.040: E/AndroidRuntime(29309): Caused by: java.lang.NullPointerException
[...]
org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1512)

に渡しnullているinputstreamcopy()と、これが NPE の原因になります。

于 2013-04-08T23:24:11.197 に答える