Я хочу показать анимацию загрузки при подключении к веб-сокету

Я пытаюсь показать анимацию в своем приложении при подключении к веб-серверу, просто чтобы пользователь не подумал, что он разбился/завис.

Вот бит в коде, который может иметь значение:

private void waitForWebSocketConnect() {
    long start = System.currentTimeMillis();
    long end = start + 3*1000; // 3 seconds
    while (!mWebSocketClient.isOpen()) {
        try {
            Thread.sleep(200);
            if(System.currentTimeMillis() >= end){
                throw new InterruptedException();
            }
        } catch (InterruptedException e) {
            fatalError("WebSocket did not connect. Please try again.");
        }
    }
}

Я думаю, что это также может быть полезно:

private void connectWebSocket() {

    final Activity faActivity = super.getActivity();

    URI uri;
    try {
        String uriString;
        if(isRegistering){
            //uriString = "ws://app.touchtechpayments.com:80/reg";
            uriString = "wss://ec2-52-16-13-241.eu-west-1.compute.amazonaws.com/reg";
        } else {
            //uriString = "ws://app.touchtechpayments.com:80/trans";
            uriString = "wss://ec2-52-16-13-241.eu-west-1.compute.amazonaws.com/trans";
        }
        Log.d("uriString", uriString);
        uri = new URI(uriString);
    } catch (URISyntaxException e) {
        e.printStackTrace();
        return;
    }

    mWebSocketClient = new WebSocketClient(uri) {
        @Override
        public void onOpen(ServerHandshake serverHandshake) {
            this.progressBar.setVisibility(View.GONE);
            Log.d("Websocket", "Opened");
        }

        @Override
        public void onMessage(String s) {
            Log.d("Websocket", "Received message " + s);

            if(isRegistering) {
                confirmRegistration(s);
            } else {
                confirmTransaction(s);
            }

        }

        @Override
        public void onClose(int i, String s, boolean b) {
            Log.d("Websocket", "Closed " + s);

            if(!allDone) {

                if (triedTwice) {

                    final String printToast = "Error received: " + s + "\nPlease try again.";

                    faActivity.runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(context, printToast, Toast.LENGTH_LONG).show();
                            faActivity.getFragmentManager().popBackStack();
                        }
                    });

                } else {

                    Log.d("Websocket", "Trying for second time.");

                    triedTwice = true;
                    if (lastInputToServer != null) {
                        setupSSL();

                        connectWebSocket();
                        waitForWebSocketConnect();

                        mWebSocketClient.send(lastInputToServer);

                    }

                }
            }
        }

        @Override
        public void onError(Exception e) {
            this.progressBar.setVisibility(View.GONE);
            Log.d("Websocket", "Error " + e.getMessage());
        }
    };

    setupSSL();
    mProgressBar.setVisibility(View.VISIBLE);
    mWebSocketClient.connect();
}

WebSocketClient на самом деле не определен в onCreate(), но описанный выше метод все равно используется в onCreate().


person CiaranC94    schedule 30.04.2015    source источник
comment
Вы можете использовать компонент ProgressBar?   -  person Tim Kranen    schedule 30.04.2015
comment
stackoverflow.com/questions/9814821/show-progressdialog-android   -  person Muzaffer    schedule 30.04.2015
comment
Я пытался использовать ProgressBar, но он просто появляется независимо от того, что я делаю.   -  person CiaranC94    schedule 30.04.2015


Ответы (2)


Сначала определите ProgressBar в файле layout.xml и включите неопределенный режим с помощью параметра indeterminate:

<ProgressBar  
     android:id="@+id/progressBar"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:visibility="invisible" 
     android:indeterminate = "true"/>

Затем скройте свой progressBar, как только соединение с веб-сокетом будет установлено:

public void onCreate(){

    [...]

    mProgressBar     = (ProgressBar) findViewById(R.id.progressBar);

    mWebSocketClient = new WebSocketClient(uri) {

        @Override
        public void onOpen(ServerHandshake serverHandshake){
            this.progressBar.setVisibility(View.GONE); // or INVISIBLE
        }
        @Override
        public void onMessage(String s) {

        }

        @Override
        public void onClose(int i, String s, boolean b) {
        }
        @Override
        public void onError(Exception e) {
            this.progressBar.setVisibility(View.GONE); // or INVISIBLE
        }
    };

    mProgressBar.setVisibility(View.VISIBLE);
    mWebSocketClient.connect();
}

Вы также можете определить свой ProgressBar как невидимый и показать его позже перед вызовом mWebSocketClient.connect().

P.S. В этом примере я использую эту библиотеку java websocket.

dependencies {
    compile "org.java-websocket:Java-WebSocket:1.3.0"
}
person dieter    schedule 30.04.2015
comment
Я хочу, чтобы он отображался только при попытке подключиться к веб-сокету. Должен ли я определить его как невидимый в этом случае? - person CiaranC94; 06.05.2015
comment
Должен ли я что-то делать в onClose()? Кроме того, почему вы используете this.progressBar? Это не будет работать в моем коде. - person CiaranC94; 06.05.2015
comment
Просто для пояснения я добавил свой метод connectWebSocket(), в котором определяется WebSocketClient. - person CiaranC94; 06.05.2015
comment
Хорошо, я только что попробовал это сейчас. ProgressBar не отображается, если я не сделаю его видимым внутри onOpen(), а не непосредственно перед mWebSocketClient.connect(), но опять же, в файле макета также есть TextViews и ImageViews, поэтому они могут скрывать progressBar. - person CiaranC94; 06.05.2015
comment
Извините, что потребовалось время, чтобы вернуться, но поможет ли использование AsyncTask? - person CiaranC94; 13.05.2015
comment
AsyncTask не поможет. WebSocketClient уже использует асинхронное соединение. вот почему у вас есть методы onOpen или onClose. - person dieter; 13.05.2015
comment
Хорошо спасибо. Дело в том, что как только фрагмент открывается, появляется progressBar. Я просто хочу, чтобы он отображался при отправке данных через веб-сокет. - person CiaranC94; 13.05.2015
comment
@CiaranC94, какие данные вы имеете в виду? - person dieter; 13.05.2015
comment
Он предназначен для отправки хешированных буквенно-цифровых токенов на сервер. Я стажер, и я должен разрабатывать приложение для обработки платежей. - person CiaranC94; 13.05.2015
comment
хорошо, пусть ProgressBar будет скрыт и сделает его видимым, если пользователь нажмет кнопку отправки. Сделайте его видимым, если вам это нужно, и скройте, если операция была завершена - person dieter; 13.05.2015
comment
Извините, я должен был быть более ясным. В методе onMessage() могут произойти две вещи: подтвердить регистрацию() или подтвердить транзакцию(). Это когда сообщение (т.е. токен) отправляется на сервер. РЕДАКТИРОВАТЬ: я только что увидел ваше сообщение. - person CiaranC94; 13.05.2015
comment
Давайте продолжим обсуждение в чате. - person dieter; 13.05.2015

вы можете использовать j индикатор выполнения в программе одновременно с таймером, чтобы пользователь мог видеть движущийся индикатор выполнения... если вы хотите, ответьте мне, я дам вам кодировку того, как использовать индикатор выполнения.. .

person Ishak Ayub    schedule 30.04.2015
comment
Да, я ищу решение - person Rami Salim; 24.02.2020