/ / Jak radzić sobie z IllegalStateException w przesyłaniu plików za pomocą biblioteki Smack? - java, android, chat, smack, nielegstateexception

Jak obsługiwać IllegalStateException w przesyłaniu plików za pomocą biblioteki Smack? - java, android, chat, smack, nielegstateexception

Używam aplikacji do czatubiblioteka asmack-jse-buddycloud-2010. Korzystając z tej możliwości, mogę wykonywać czat i transfer plików, ale w testowaniu 1 występuje scenariusz "s", podczas przesyłania pliku (załóżmy, że rozmiar pliku> 1 MB lub anizja) albo serwer się zawiesza, albo tracimy internet połączenie w takim przypadku aplikacja ulega awarii przez zgłoszenie wyjątku

Dziennik błędów:

  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)

Próbowałem złapać ten wyjątek, ale nadal awarię aplikacji z tym samym wyjątkiem każda pomoc zostanie doceniona.

tutaj jest mój kod

    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");

}


}

}

Odpowiedzi:

0 dla odpowiedzi № 1

spróbuj sprawdzić status połączenia XMPPConnection przed wysłaniem pliku:

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

Mam nadzieję, że to pomoże.