В этих случаях вам нужно обрабатывать разъединение вручную. Я имею в виду, что вы должны перехватывать любое разъединение, прослушиватель соединений уведомляет вас, когда вы разорвали соединение.
public void connectionClosedOnError (Исключение исключения)
import android.util.Log;
import com.dagm8.core.protocols.ConnectionState;
import com.dagm8.core.service.XMPPService;
import com.dagm8.events.ConnectionStateEvent;
import org.greenrobot.eventbus.EventBus;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import java.io.IOException;
import static com.dagm8.core.protocols.ConnectionState.CONNECTED;
import static com.dagm8.core.protocols.ConnectionState.DISCONNECTED;
import static com.dagm8.core.protocols.ConnectionState.RECONNECTING;
/**
* dagm8-android
* Created by Bedoy on 8/28/17.
*/
public class ConnectionController implements ConnectionListener {
private String TAG = getClass().getCanonicalName();
private XMPPTCPConnection mConnection;
public void setConnection(XMPPTCPConnection connection) {
mConnection = connection;
}
public void init(XMPPTCPConnection connection) throws InterruptedException, XMPPException, SmackException, IOException {
setConnection(connection);
mConnection.setPacketReplyTimeout(10000);
mConnection.addConnectionListener(this);
mConnection.connect();
}
@Override
public void connected(XMPPConnection connection) {
XMPPService.connectionState = RECONNECTING;
notifyConnectionState(RECONNECTING);
try {
mConnection.login();
} catch (XMPPException | SmackException | IOException | InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "connected()");
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
XMPPService.connectionState = CONNECTED;
notifyConnectionState(CONNECTED);
Log.i(TAG, "authenticated()");
}
@Override
public void connectionClosed() {
XMPPService.connectionState = DISCONNECTED;
notifyConnectionState(DISCONNECTED);
Log.i(TAG, "connectionClosed()");
}
@Override
public void connectionClosedOnError(Exception e) {
XMPPService.connectionState = DISCONNECTED;
notifyConnectionState(DISCONNECTED);
try {
mConnection.connect();
} catch (SmackException | IOException | XMPPException | InterruptedException exception) {
exception.printStackTrace();
}
Log.i(TAG, "connectionClosedOnError()");
}
@Override
public void reconnectingIn(int seconds) {
XMPPService.connectionState = RECONNECTING;
notifyConnectionState(RECONNECTING);
Log.i(TAG, "reconnectingIn()");
}
@Override
public void reconnectionSuccessful() {
XMPPService.connectionState = CONNECTED;
notifyConnectionState(CONNECTED);
Log.i(TAG, "reconnectionSuccessful()");
}
@Override
public void reconnectionFailed(Exception e) {
XMPPService.connectionState = DISCONNECTED;
notifyConnectionState(DISCONNECTED);
Log.i(TAG, "reconnectionFailed()");
}
private void notifyConnectionState(ConnectionState state) {
EventBus.getDefault().post((ConnectionStateEvent) () -> state);
}
public boolean isAuthenticated()
{
return mConnection.isAuthenticated();
}
public void login() {
try {
mConnection.login();
} catch (XMPPException | SmackException | IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
UIWebView не может воспроизводить видео. Переход на страницу Youtube с помощью UIWebview просто запустит приложение Youtube на iPhone. Выполнение этого определенного способа вернет управление вашему приложению после воспроизведения видео. См. Здесь: http://iphoneincubator.com/blog/tag/uiwebview
Я бы рекомендовал использовать MPMoviePlayer Controller, если вы выполняете только простую потоковую передачу. Вот пример кода, который поможет вам начать:
NSString *url = @"http://www.example.com/path/to/movie.mp4";
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]
initWithContentURL:[NSURL URLWithString:url]];
[moviePlayer play];
РЕДАКТИРОВАТЬ: Мой исходный пример в этом ответе инициализирован веб-просмотр с рамкой CGRectZero. Это работало до iOS 3.2. Начиная с iOS 4, веб-просмотр должен иметь ненулевой кадр, иначе видео не будет воспроизводиться. Я отредактировал свой пример ниже, чтобы отразить это изменение.
Принятый здесь ответ неверен. Фактически вы можете использовать UIWebView для потоковой передачи видео, и в некотором смысле это лучше, чем MPMoviePlayerController. Если вы укажете UIWebView запросить видеофайл (например, mp4) через loadRequest :, он откроет новое окно и потоковое видео в вашем приложении. В отличие от MPMoviePlayerController, видеоокно, созданное UIWebView, можно повернуть в альбомную или портретную ориентацию. Когда видео закончится, пользователь может закрыть это окно и вернуться в ваше приложение.
РЕДАКТИРОВАТЬ 2: Поскольку теперь вы можете реализовать видеопроигрыватель, который вращается с помощью MPMoviePlayerViewController, я больше не могу думать о причине использования UIWebView для видео с использованием метод, описанный в этом ответе.
Подсказка: поскольку UIWebView создает собственное окно для воспроизведения видео, вам даже не нужно добавлять UIWebView в иерархию представлений. Вы можете просто создать объект UIWebView и вызвать loadRequest: для воспроизведения видео, никогда не передавая объект в addSubview:.
self.webView = [[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
NSURL *url = [NSURL URLWithString:@"http://www.jonathancoulton.com/music/thingaweek/CodeMonkey.mp3"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];