2

タイトルが示すように、folder.open()を実行しようとすると失敗しますが、エラーはスローされないため、理由を見つけるのは困難です。私のデバッグコンソールでは、次のエラーが表示されますが、関連している場合と関連していない場合があります(これは、folder.open()ブレークポイントの後でresumeを押した後にのみ表示されます)。

開発にはAndroid用のJavaMailAPIを使用しています。IMAPサーバーではすべて正常に機能していましたが、POP3メールサーバーにも接続できる必要があります。接続しているストアはGMAILであり、GMAILアカウントで必要なすべての設定が変更されています。

04-12 13:22:26.682: INFO/dalvikvm(436): Ljava/lang/IllegalStateException;: Folder is not Open
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:512)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:227)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.finalize(POP3Folder.java:506)
04-12 13:22:26.682: INFO/dalvikvm(436):     at dalvik.system.NativeStart.run(Native Method)

pop3の接続方法は次のとおりです。

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        Properties pop3Props = new Properties();

        pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
        pop3Props.setProperty("mail.pop3.port",  "995");
        pop3Props.setProperty("mail.pop3.socketFactory.port", "995");

        URLName url = new URLName("pop3", "pop.gmail.com", 995, "",
                "******@googlemail.com", "*****");

        //session = Session.getInstance(pop3Props, null);
        Session session = Session.getInstance(pop3Props, new javax.mail.Authenticator() 
        {   
            protected PasswordAuthentication getPasswordAuthentication() 
            {
                return new PasswordAuthentication("***********", "*****");
            }
        });

        session.setDebug(true);

        store = new POP3SSLStore(session, url);
        store.connect();

ストアに接続する方法は次のとおりです(問題が発生している場合)。

folders = store.getFolder("INBOX");
        //Folder folder = store.getFolder("INBOX");
        if (folders.isOpen()) 
        {
            if ((folders.getMode() & Folder.READ_WRITE) != 0) 
            {
                folders.close(false);
                folders.open(Folder.READ_ONLY);
            }
        } 
        else 
        {
            try
            {
                folders.open(Folder.READ_ONLY);
            }
            catch (Exception e)
            {
                Log.i("Folder Opening,", e.toString());
            }
        }

どんなアイデアも役に立ちます!セッションはデバッグされており、問題は明らかではありません。あなたが支援するためにさらに情報が必要な場合は、遠慮なく質問してください!この問題を抱えているのは私だけではないと確信しています。

ありがとう!リス

4

1 に答える 1

4

そのため、この問題にも遭遇しました。

その例外がトリガーされているPOP3Folderの実装を調べました。

オブジェクトが存在しなくなる前にクリーンアップを実行するために、 POP3Folderがfinalize()をオーバーライドしているようです。finalize()オーバーライドはclose()を呼び出し、フォルダーが開いているかどうかを確認します。開いていない場合は、表示されるIllegalStateExceptionスローされます。

これが、散発的に見られる理由です。これは、 GCがオブジェクトを確認するためにやってきたときに発生し、その時点でフォルダーは既に閉じられている可能性があるため、finalize()がclose( )を呼び出すまでに、フォルダーが開いているかどうかを確認します。例外をスローします。

今、私はこれが賢いのか愚かなのかを話すことができません。close()が例外をスローするのではなく、フォルダーが既に閉じられて移動しているという事実を無視する場合は、コードの方が優れているようです。

POP3Folderは、パラメーター化されたコンストラクターを取ります。残念ながら、公開も保護もされていないため、単純に派生してclose()メソッドをオーバーライドし、フォルダーが開いているかどうかのチェックを削除することはできません。

ただし、例外呼び出しスタックはfinalize()から発生するため、 finalize()からスローされた例外は通常、そのオブジェクトのファイナライズプロセス(ガベージコレクション)を停止するだけで、そのままにしておく危険性は少なくなります。はるかに多くのダメージ。

ただし、これに対する適切な解決策を確認したいと思います。

于 2011-08-12T05:32:09.560 に答える