所以我没有运气试图找到问题的解决方案。 这是它正在发生的事情,我希望也许有人可以帮助我:
我有一个名为purchaseItems的类,它加载IabHelper并加载用户购买的应用内商品。此类处理与应用内购买有关的所有内容。
当某个活动启动时,我在活动的onCreate()方法中初始化了类purchaseItems。但是,buyItems类似乎需要2-3秒才能完成加载或获取所有应用内购买,以确定用户支付的费用。
我希望在活动中的onCreate()方法中初始化purchaseItems类并等到它完成后再继续加载活动中的其他所有内容。我想在开始加载purchaseItems类时弹出一个进度对话框,一旦完成purchaseItems类的加载就离开。
同样,purchaseItems只是一个不扩展到任何东西的类。它只是初始化IaHelper以管理应用内购买等。
我没有运气,所以请有人帮帮我吗? 谢谢 d
答案 0 :(得分:0)
考虑使用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
子类看起来像这样(通用实现 - 如果需要,您可以使用不同的返回类型):
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
}
};
要记住的一件重要事情是,您永远不应该尝试从doInBackground()
访问UI,因为它不在UI线程上运行。如果您希望获得幻想并显示已加载的购买(如果已知),则可以使用publishProgress()
AsyncTask
方法,该方法会触发对onProgressUpdated()
的调用UI线程,可以访问用户界面(例如更新进度条等)。
另一件需要注意的事情是,如果任务永远不会完成,可能会挂起你的主线程,所以你应该防范(可能是超时)。
找到AsyncTask
课程的文档here。
答案 1 :(得分:0)
不幸的是,我没有找到我认为它是上述问题的正确解决方案。我最终做的是初始化IabHelper对象,然后在执行更多代码之前添加2-3秒的延迟。这允许IabHelper被初始化并且有2-3秒的时间来完成它在使用之前必须做的任何事情。