Android onCreate在继续之前暂停,直到类加载

Android onCreate在继续之前暂停,直到类加载,android,in-app-purchase,Android,In App Purchase,所以我一直没有找到解决问题的办法。 下面是正在发生的事情,我希望有人能帮助我: 我有一个名为purchasedItems的类,它加载IbaHelper并加载用户购买的应用内项目。这个类处理所有与应用内购买有关的事情 当某个活动启动时,我在该活动的onCreate()方法中初始化了purchasedItems类。然而,purchasedItems类似乎需要2-3秒来完成加载或获取所有应用内购买,以确定用户是否支付了哪些 我希望在活动中的onCreate()方法期间初始化purchasedItems

所以我一直没有找到解决问题的办法。 下面是正在发生的事情,我希望有人能帮助我:

我有一个名为purchasedItems的类,它加载IbaHelper并加载用户购买的应用内项目。这个类处理所有与应用内购买有关的事情

当某个活动启动时,我在该活动的onCreate()方法中初始化了purchasedItems类。然而,purchasedItems类似乎需要2-3秒来完成加载或获取所有应用内购买,以确定用户是否支付了哪些

我希望在活动中的onCreate()方法期间初始化purchasedItems类,并在继续加载活动中的所有其他内容之前等待它完成。我希望在开始加载purchasedItems类时弹出一个进度对话框,并在完成purchasedItems类的加载后立即消失

同样,purchasedItems只是一个不扩展到任何内容的类。它所做的只是初始化IaHelper,以便管理应用内购买等

我在这方面运气不好,有人能帮帮我吗? 非常感谢。
D

考虑使用
AsyncTask
。这将允许您在后台进行加载,然后在加载完成时通知UI线程。在
onCreate()
中,打开进度对话框,然后运行循环,等待后台线程完成。它看起来像这样:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // do various things
    LoadStuffTask t = (LoadStuffTask) new LoadStuffTask().execute(); // launch the background task
    // pop up your dialog box
    while(t.getStatus() != AsyncTask.Status.FINISHED)
    {
       // wait on background thread
    }
    // task finishes, close your dialog
}
您的
AsyncTask
子类可以如下所示(通用实现-如果需要,您可以有不同的返回类型):

受保护类LoadStuffTask扩展了AsyncTask
{
@凌驾
受保护的Void doInBackground(Void…params)//后台线程调用此方法
{
//完成你的加载
返回null;
}
@凌驾
protected void onPostExecute(void v)//当doInBackground返回时调用此方法-一旦完成,AsyncTask的状态将设置为FINISHED
{
//如果你想在这里做任何事,由你决定
}
};
需要记住的一件重要事情是,永远不要尝试从
doInBackground()
访问UI,因为它不在UI线程上运行。如果你想展示已经加载(如果知道)的购买信息,你可以使用
AsyncTask
publishProgress()
方法,在UI线程上触发对
onProgressUpdated()
的调用,在这里你可以访问UI(例如更新进度条或其他)

另一件需要注意的事情是,如果任务从未完成,主线程可能会挂起,因此您应该对此加以防范(可能会有一个超时)


找到了
AsyncTask
类的文档。

不幸的是,我没有找到我认为正确的解决上述问题的方法。我最后做的是初始化IabHelper对象,然后在执行更多代码之前添加2-3秒的后期延迟。这使得IABHeloper可以初始化,并且在使用之前有2-3秒的时间完成它必须完成的任何操作。

仔细想想。。。阻止主线程等待任务并不比直接在主线程上执行任务更有用。这样做可能会更好,除非您计划在主线程上同时发生一些事情。
protected class LoadStuffTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void ... params) // your background thread calls this method
    {
        // do your loading
        return null;
    }

    @Override
    protected void onPostExecute (Void v) // this method is called when doInBackground returns - once it finishes, the AsyncTask will have its status set to FINISHED 
    {
        // up to you if you want to do anything here
    }
};