簡體   English   中英

如何使用Smack庫處理文件傳輸中的IllegalStateException?

[英]How to handle IllegalStateException in file transfer using Smack library?

我正在使用asmack-jse-buddycloud-2010庫制作一個聊天應用程序。使用此程序,我可以進行聊天和文件傳輸,但是在測試1種情況下,在傳輸文件(假設文件大小> 1MB或任意大小)時,任一服務器停機或我們失去互聯網連接的情況下,應用程序會因拋出異常而崩潰

錯誤日志:

  07-02 13:09:05.983: E/AndroidRuntime(12913): FATAL EXCEPTION: File Transfer jsi_555743874184501198
07-02 13:09:05.983: E/AndroidRuntime(12913): Process: com.example.chat_demo, PID: 12913
07-02 13:09:05.983: E/AndroidRuntime(12913): java.lang.IllegalStateException: Not connected to server.
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smack.XMPPConnection.sendPacket(XMPPConnection.java:488)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.packet.SyncPacketSend.getReply(SyncPacketSend.java:41)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.packet.SyncPacketSend.getReply(SyncPacketSend.java:61)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IQIBBOutputStream.writeToXML(InBandBytestreamSession.java:763)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.flushBuffer(InBandBytestreamSession.java:707)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.closeInternal(InBandBytestreamSession.java:737)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession.closeByLocal(InBandBytestreamSession.java:191)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession.close(InBandBytestreamSession.java:153)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IQIBBOutputStream.writeToXML(InBandBytestreamSession.java:768)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.flushBuffer(InBandBytestreamSession.java:707)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.writeOut(InBandBytestreamSession.java:679)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.write(InBandBytestreamSession.java:641)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamSession$IBBOutputStream.write(InBandBytestreamSession.java:644)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.filetransfer.FileTransfer.writeToStream(FileTransfer.java:217)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer$2.run(OutgoingFileTransfer.java:231)
07-02 13:09:05.983: E/AndroidRuntime(12913):    at java.lang.Thread.run(Thread.java:811)

我試圖捕獲此異常,但仍會因相同的異常而崩潰,因此不勝感激。

這是我的代碼

    File file ;

    configureProviderManager(connection);

    FileTransferNegotiator.setServiceEnabled(connection, true);
    FileTransferManager manager = new FileTransferManager(connection);




String to = connection.getRoster().getPresence(to).getFrom();


                         transfer = manager.createOutgoingFileTransfer(to);

                 try {

                            configureProviderManager(connection);
            //here file trasfer occur's .parameters are file and filename(has nothing to do with transfer)

                           transfer.sendFile(file,file.getName().tostring());

                    } catch (IllegalStateException e) {

                            Log.i("illegal state exception","caught  ");
                            //transfer.cancel();
                        }catch (XMPPException e) {

                               e.printStackTrace();
                               }

                 while(!transfer.isDone()) {
                            if (transfer.getStatus() == Status.error) {

                                    transfer.cancel();
                            }


                            if(transfer.getStatus().equals(Status.refused))
                            System.out.println("refused  " + transfer.getError());
                            else if( transfer.getStatus().equals(Status.error))

                                 System.out.println(" error " + transfer.getError());
                                 } 
                            if(transfer.getStatus().equals(Status.cancelled)){

                             System.out.println(" cancelled  " + transfer.getError());
                             }

                            else


                            System.out.println("Success");

                            }


                        }

    }

在發送文件之前,請嘗試檢查XMPPConnection的狀態:

if(connection.isConnected()){
     transfer.sendFile(file,file.getName().tostring());
} else {
     // message to the user
}

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM