3

私は今これで6時間ほど戦っています。私はDropboxの「チュートリアル」(非常に貧弱であるため、それと呼べる場合)に従い、DBRouletteの例で遊んで、アプリを機能させるためにたくさんのことをしました。

私のアプリは問題なく認証できます。しかし、チュートリアルが行っていることを正確に実行しているにもかかわらず、何もアップロードできません。

これは私が持っているコードの小さな断片です(これは、作成したメモを電話自体に保存してから、Dropboxにアップロードするためのものです):

        saveBtn.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            try
            {
                //Create the directory if it doesn't exist. If it does exist the next two line won't do anything.
                File dropNotesDir = new File(Environment.getExternalStorageDirectory() + "/documents/AppData/Dropnotes/");
                dropNotesDir.mkdirs();
                //-----------------------------------------------------------------------------------------------
                String wholeNoteString = noteBody.getText().toString();
                //Now we create the title of the txt file. It will be the first line of the whole note. The name will get truncated to 32 characters
                //if it's too long.
                String noteTitle;
                if(wholeNoteString.indexOf("\n") >= 0) //New line character found.
                {
                    noteTitle = wholeNoteString.substring(0, wholeNoteString.indexOf("\n"));
                    if(noteTitle.length() >= 32)
                    {
                        noteTitle = wholeNoteString.substring(0, 32);
                    }
                }
                else
                {
                    if(wholeNoteString.length() >= 32)
                    {
                        noteTitle = wholeNoteString.substring(0, 32);
                    }else
                    {
                        noteTitle = wholeNoteString;
                    }
                }
                if(extras.getString("file-mode").equals("modify"))
                {
                    //We will need to delete the existing file if it does exist to save the new one.
                    File existing = new File(Environment.getExternalStorageDirectory() + "/documents/AppData/Dropnotes/" + extras.getString("noteTitle"));
                    existing.delete();
                }
                File newNote = new File(Environment.getExternalStorageDirectory() + "/documents/AppData/Dropnotes/" + noteTitle + ".txt");
                PrintWriter newNoteWriter = new PrintWriter(new FileOutputStream(newNote));
                newNoteWriter.print(noteBody.getText().toString());
                newNoteWriter.close();

                //TRYING TO UPLOAD TO DROPBOX HERE
                File fileToUpload = new File(Environment.getExternalStorageDirectory() + "/documents/AppData/Dropnotes/" + noteTitle + ".txt");
                FileInputStream file2Uis = new FileInputStream(fileToUpload);
                Entry newEntry = mDBApi.putFile("/" + noteTitle + ".txt", file2Uis, fileToUpload.length(), null, null);
                //END OF TRYING TO UPLOAD TO DROPBOX HERE

                Toast.makeText(view.getContext(), "Saved successfully", Toast.LENGTH_SHORT).show();
                finish();
            } catch (FileNotFoundException e)
            {
                Toast.makeText(view.getContext(), "File not found: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            } catch(Exception e)
            {
                Toast.makeText(view.getContext(), "Some bizarre exception occured: " + e.getClass().toString(), Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }

    });

NetworkOnMainThreadExceptionが発生しますが、その理由はわかりません。ここで「ファイルのアップロード」というタイトルのセクションをたどろうとしています。彼らのスニペットについて私を困惑させているのは、彼らが私が投げられている例外を捕まえようとさえしていないということです...

何か助けはありますか?私は本当に来週の金曜日にこれを機能させる必要があります。

4

2 に答える 2

7

Honeycomb SDKより前は、メインスレッドでネットワーク操作を実行することが許可されていました。ただし、Honeycombでは許可されなくなりNetworkOnMainThreadException、メイン/UIスレッドでネットワーク操作が試行されるとaがスローされます。

別のスレッドでネットワーク操作を実行する必要があります。あなたはAsyncTask同じことを達成するために見てみることができます。

于 2012-06-05T06:55:30.160 に答える
-4

私の推測では、StrictMode.ThreadPolicyによって引き起こされたエラーです。同じUIスレッドでネットワークにアクセスすることはできません。

oncreateのコードにこれらの行を追加してみてください

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy);
于 2012-06-05T06:54:34.327 に答える