2015-01-06 42 views
0

我有一个运行每次用户启动应用程序,以验证用户接入功能。在每次启动时,用户标识将被发送到服务器以进行身份​​验证,当它们通过身份验证时,用户可以使用该应用程序。使应用程序等待,直到HTTP响应收到

的问题我不能让在主线程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; 
    } 
+1

'带有'ProgressDialog'的AsyncTask'将创建魔术..! – user370305

+0

使用ProgressBar是推荐的方法来指示进度,然后在请求完成时将其隐藏。此外,这可能有点超过顶部,但考虑使用Robospice或专业图书馆做网络请求,以节省您一些麻烦,稍后在https://github.com/stephanenicolas/robospice/wiki –

回答

0

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

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

或者你可以让你的布局不可见的使用android:visibility="gone",并作出进度可见,直到认证是然后使用setVisibility(View.VISIBLE);你查看对象和ProgressDialog,以无形再次打开你主视图中可见。

0

如果标准listadapter是你的主要活动/片段,你可以做到以下几点:

的道理,只安装适配器(emptydatalist)AUTH之前,并显示在与空消息的UI列表( “检查用户身份验证”)。如果你使用wifi,它可能会很快,以至于他们看不到任何初始UI。

如果你已经有可能是有效的,可以使用它在dataCall以获取列表的适配器,然后进行数据呼叫,你可能会得到列表或者可能得到错误(没有AUTH)

如果令牌你得到的数据,然后更新适配器的数据列表,并调用适配器上的“notify()”,你就完成了......

如果你没有获取数据,或者你不想进行数据的初始调用然后使用陈旧的令牌....

打电话来验证使用...

使用从上述的响应

刷新数据的数据呼叫..(有效令牌)在适配器

呼叫适配器上通知。

注意所有数据呼叫发生在后台线程。通过主UI线程上发生的Notify UI回调。

注意你不需要你自己的线程遵循这个还挺模式,因为该框架还内置了API的东西这个用例。如上面所提到,你可以使用的AsyncTask,也可以使用与队列HTTP可运行及事件驱动的回调消息尺蠖(HTTP的响应,处理程序读取响应数据和消息发送回主UI)