1

ダウンロードは非常に簡単だと思っていたので、インターネットから xml ファイルをダウンロードして内部メモリに保存しようとすると、エラーが発生します。samsung galaxy s3でアプリをテストしているため、内部メモリを使用しています。

ダウンローダのコードは次のとおりです。実際にはアクティビティから呼び出されるスレッドです

public class DownloaderThread extends Thread
{
    private static final int DOWNLOAD_BUFFER_SIZE = 4096;
    Context context;
    private String downloadUrl = "some address";

    public void run()
    {
            URL url;
            URLConnection conn;
            String fileName;
            BufferedInputStream inStream;
            BufferedOutputStream outStream;
            File outFile;
            FileOutputStream fileStream;

            try
            {
                    url = new URL(downloadUrl);
                    conn = url.openConnection();
                    conn.setUseCaches(false);
                    fileName = "file.xml";

                    Log.v("XML", "Download Started");

                    // start download
                    inStream = new BufferedInputStream(conn.getInputStream());
                    outFile = new File(context.getFilesDir() + "/" + fileName);
                    fileStream = new FileOutputStream(outFile);
                    outStream = new BufferedOutputStream(fileStream, DOWNLOAD_BUFFER_SIZE);
                    byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
                    int bytesRead = 0;
                    while(!isInterrupted() && (bytesRead = inStream.read(data, 0, data.length)) >= 0)
                    {
                            outStream.write(data, 0, bytesRead);
                    }

                    outStream.close();
                    fileStream.close();
                    inStream.close();

                    if(isInterrupted())
                    {
                            outFile.delete();
                    }
                    else
                    {
                            Log.v("XML","Download Finished");
                            Log.v("PATH","File is stored in direcotry:" + outFile.getAbsolutePath().toString());
                    }
            }
            catch(MalformedURLException e)
            {
                e.printStackTrace();
                Log.v("Error",e.toString());

            }
            catch(FileNotFoundException e)
            {
                e.printStackTrace();
                Log.v("Error",e.toString());
            }
            catch(Exception e)
            {
                e.printStackTrace();
                Log.v("Error",e.toString());
            }
    }

スレッドを呼び出すコードは次のとおりです。

public boolean onOptionsItemSelected(MenuItem item) {
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     android.net.NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
     android.net.NetworkInfo datac = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
     if ( item.getItemId() == DOWNLOAD_XML_MENU_ITEM ) {
            if ((wifi != null & datac != null) && (wifi.isConnected() | datac.isConnected())) 
            {
                downloaderThread = new DownloaderThread();
                downloaderThread.start();
            }
            else 
            {
                displayConnectionAlert();
            }
        }
        return true;
    }

私が受け取るエラーは次のとおりです。タグトレース - そのようなファイルとディレクトリはありません。ログのダウンロードが開始された後、outFile のパスで NullPointerException が発生します。理由はありますか?

4

2 に答える 2

2

値が割り当てられていない参照を使用しているContextため、NPE です。

Context context; // never initialised anywhere, thus null

すべての変数は解決するために使用されるためcontext.getFilesDir()、引数としてパスを取るスレッド クラスのコンストラクターを作成することをお勧めします。すなわち:

public DownloaderThread(String targetDir) { /* implement here */ }

または、実際にインスタンスを渡すこともできますが、メモリ リークの可能性を避けるためにContext、( ではなく) アプリケーション コンテキストであることを確認してください。Activity

于 2012-12-12T19:36:36.453 に答える
0

とりわけ、 を呼び出す必要がありますconn.connect()。接続を開くだけでは、ホストには接続されません。

new File(getFilesDir(), fileName)また、簡単なヒント: ファイルを作成するときは、文字列連結を行うよりも簡単で (IMHO) 使用する方が適切です。

于 2012-12-12T19:15:54.780 に答える