我首次使用新的v3 API设置了In-App Billing.它在我的设备上正常工作,但我收到了很多其他用户的错误报告.
其中之一是:
java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
at my.package.util.iab.IabHelper.checkSetupDone(IabHelper.java:673)
at my.package.util.iab.IabHelper.queryInventory(IabHelper.java:462)
at my.package.util.iab.IabHelper$2.run(IabHelper.java:521)
at java.lang.Thread.run(Thread.java:1019)
Run Code Online (Sandbox Code Playgroud)
另一个是:
java.lang.NullPointerException
at my.package.activities.MainActivity$4.onIabSetupFinished(MainActivity.java:159)
at my.package.util.iab.IabHelper$1.onServiceConnected(IabHelper.java:242)
Run Code Online (Sandbox Code Playgroud)
我的活动实现遵循Google的示例代码(所有引用的类都不受示例影响):
IabHelper mHelper;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
mHelper = new IabHelper(this, IAB_PUBLIC_KEY);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh noes, there was a problem.
return;
}
// Hooray, IAB is fully set up. Now, let's get an inventory of
// stuff …
Run Code Online (Sandbox Code Playgroud) 我正在使用以下内容启动一项新活动:
Intent intent = new Intent(this, MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(0, 0);
Run Code Online (Sandbox Code Playgroud)
在MyNewActivity
启动时,会显示黑屏.
如果我删除Intent.FLAG_ACTIVITY_CLEAR_TASK
,活动将在任何时刻启动而不显示黑屏(而是在新加载时显示上一个活动).
有没有办法避免这个黑屏?删除标志似乎不是一个选项(我需要清除所有当前任务的堆栈并启动一个新的活动作为根目录).
编辑:我附上一个非常简单的代码,重现问题(设置一个黑暗的主题,如Theme.AppCompat
应用程序).黑屏显示的时间非常短(取决于启动时接收活动的工作量),但您可以看到它.如果您不使用FLAG_ACTIVITY_CLEAR_TASK
,则不会显示黑屏并且过渡平滑:
主要活动
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(0,0);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
MyNewActivity
public class MyNewActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new); …
Run Code Online (Sandbox Code Playgroud)