使应用程序等待,直到收到http响应

时间:2015-01-06 21:12:23

标签: android multithreading

每次用户启动应用程序时,我都会运行以验证用户访问权限的功能。每次启动用户ID和令牌被发送到服务器进行身份验证,当他们通过身份验证后,用户就可以使用该应用程序。

发出我无法通过主线程进行HTTP调用。在单独的线程中,我无法停止等待响应。

那么如何让应用程序等到收到身份验证响应后呢?

if (usrObj.authenticateUser()) {
                        Intent controllerActivity = new Intent("android.intent.action.Main");
                        startActivity(controllerActivity);
                    } else {
                       …
                    }
//User.java
public boolean authenticateUser() {
        Thread thr_authenticateUser = new Thread(new Runnable() {
            @Override
            public void run() {
                //Make HTTP authentication request and wait for the reply.
            }
        });
        thr_authenticateUser.start();
        return authenticationStatus;
    }

2 个答案:

答案 0 :(得分:0)

您不想保留UI线程。用户会认为应用程序崩溃了,他们可能会得到一个应用程序没有响应。

您可以使用Splash活动来检查您的身份验证,例如AsyncTask和不确定ProgressBar,如果成功,则导航到应用程序,然后转到登录或注册。

或者,您可以使用android:visibility="gone"使布局不可见,并在进行身份验证之前使ProgressBar可见,然后使用View对象上的setVisibility(View.VISIBLE);和ProgressDialog将主视图再次切换为可见不可见的。

答案 1 :(得分:0)

如果标准listadapter是您的主要活动/片段,您可以执行以下操作:

在令牌上验证之前,只需设置适配器(emptydatalist)并在UI上显示带有空消息的列表(“检查用户身份验证”)。如果你在wifi上,它可能都是如此之快,以至于他们不会看到任何初始UI。

如果您已经有一个可能有效的令牌并且可以在dataCall上使用它来获取适配器的列表,那么进行数据调用可能会获得列表或者可能会出错(无身份验证)

如果你获得数据,那么更新适配器的数据列表并在适配器上调用“notify()”,你就完成了....

如果您没有获取数据,或者您不想使用陈旧令牌进行数据初始调用,那么......

拨打电话验证使用...

使用上述响应进行数据调用..(有效令牌)

刷新适配器中的数据

在适配器上调用notify。

注意所有数据调用都发生在后台线程上。在主ui线程上发生对Notify的UI的回调。

请注意,您不需要自己的线程来遵循这种模式,因为该框架具有针对此用例的内置api内容。如前所述,您可以使用asyncTask,或者您可以使用带有队列的消息循环器来运行http runnables及其事件驱动的回调(在http-response,Handlers上读取响应数据并发送回主UI)