连接到WebSocket时,我想展示一个加载动画。

4
我将尝试在我的应用程序中连接到Web服务器时显示动画,以便用户不会认为它已崩溃/冻结。
以下是可能相关的代码片段:
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()中使用。


你可以使用 ProgressBar 组件吗? - Tim Kranen
https://dev59.com/EGkw5IYBdhLWcg3wi7Nz - Muzaffer
我尝试使用ProgressBar,但它无论我在做什么都会显示出来。 - CiaranC94
2个回答

2

首先在你的layout.xml中定义一个ProgressBar,并通过使用indeterminate参数启用不确定模式:

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

一旦websocket连接建立,请立即隐藏您的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();
}

您也可以将进度条定义为不可见,然后在调用mWebSocketClient.connect()之前显示它。

P.S. 在此示例中,我使用了这个Java WebSocket库。

dependencies {
    compile "org.java-websocket:Java-WebSocket:1.3.0"
}

我只希望在尝试连接WebSocket时显示它。在这种情况下,我应该将其定义为不可见吗? - CiaranC94
我应该在onClose()中做些什么吗?另外,为什么你在使用这个.progressBar?它在我的代码中不起作用。 - CiaranC94
仅为澄清起见,我已添加了我的connectWebSocket()方法,其中定义了WebSocketClient。 - CiaranC94
好的,我刚刚试了一下。除非我在onOpen()内将progressBar设置为可见,否则它不会显示出来,而不是在mWebSocketClient.connect()之前。但是,布局文件中还有TextView和ImageView,它们可能也覆盖了progressBar。 - CiaranC94
它旨在向服务器发送哈希的字母数字令牌。我是一名实习生,应该开发一个处理付款的应用程序。 - CiaranC94
显示剩余7条评论

0

你可以在程序中同时使用进度条和计时器,这样用户就可以看到移动的进度条,如果你需要的话,请回复我,我会给你如何使用进度条的代码...


是的,我正在寻找解决方案。 - Rami Salim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接