我正在编写一个使用Google Cloud Messaging的应用。该应用程序可以注册新的注册ID,没有任何问题。但是,如果我在注册期间显示不确定的ProgressBar,则注册将失败,并显示错误SERVICE_NOT_AVAILABLE
。在失败之前,该应用程序在尝试注册时也需要明显更长的时间。
ProgressBar在主要活动的布局中声明:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ActivityLogin" >
<TextView android:id="@+id/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<ProgressBar
android:id="@+id/progressBarMain"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone" />
</RelativeLayout>
ProgressBar会在开始注册前立即显示:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
...
if (reg.isEmpty())
{
progressBarMain.setVisibility(View.VISIBLE);
reg.registerInBackground(context, this);
}
}
}
registerInBackground()
运行一个AsyncTask,它进行GCM调用并将结果返回给此回调:
public void completeRegistration(RegistrationResult result)
{
if (result.success == true)
{
textHelloWorld.append("Registered new ID: " + result.registrationId);
}
else
{
textHelloWorld.append("Failed to register new ID. Reason: " + getString(result.messageId));
}
progressBarMain.setVisibility(View.GONE);
}
简单地评论两个progressBarMain.setVisibility()
调用可以让整个事情顺利运行,但只要它们被包括在内就不可能进行注册。
我在运行2.3.3的真实设备和运行4.4的模拟器上测试了这个。两者都显示相同的行为。我也尝试使用THREAD_POOL_EXECUTOR
运行AsyncTask,但这没有任何区别。