我有一个加载活动,它对服务器和转换数据的请求很少。
此活动的布局只是简单的徽标图片和progressBar
。
我的所有操作都是在onCreate()
中完成的,根据收到的服务器请求,我开始了不同的活动:
if (request == 1) { start activity A}
else { start activity B}
问题是加载需要2-3秒,并且在活动的视图进入UI之前,操作甚至在onResume()
之前进行。
所以它只是空白的活动,它做了一些工作。
如何确保仅在活动完成创建后才进行这些操作?
答案 0 :(得分:0)
如果我清楚地了解你,你想要开始活动0,其中onCreate功能正在进行互联网请求,在收到反馈后,你决定调用活动A或B.这是正确的吗?如果是,您需要在后台进行网络请求,以便您的用户界面线程不会freez。例如,您可以使用AsyncTask on on on onSostExecute方法决定激活A或B
修改强>
private class YourAsyncTask extends AsyncTask<String, Long, String> {
protected Long doInBackground(String... params) {
//here is background thread work calling net API request, hard working etc... but you can't touch UserInterface thread, since we are in background
//here call your API and parse answear
String ret = flag
return flag;
}
protected void onProgressUpdate(Long... progress) {
}
protected void onPostExecute(String result) { //here you are getting your flag from doInBackground as a result parameter
// this is executed after doInBackground, fired automatically and run on User interface thread here you can for example modify layout so you can run activity A OR B
}
}
如果你在AsyncTask中有你的逻辑,你可以从onCreate运行它,例如它并不重要。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
new YourAsyncTask().execute();
}
因此,您将显示layot,执行后将调用onPostExecute
答案 1 :(得分:0)
您需要将该服务器调用从主ui线程移开。使用IntentService或类似的东西。
答案 2 :(得分:0)
我从这个问题中了解到,您必须使用AsyncTask或Service连接到服务器。您将主线程置于while循环中,AsyncTask或Service正在为您执行所需的操作。操作完成后,它将跳出while循环,然后使用if / else循环并决定下一个开始的活动。
这样的事情:
public void onCreate(Bundle savedInstanceState)
{
boolean isDone = false;
// initialization code here
// start AsyncTask
BackgroundThread.execute(params);
while(!isDone)
{
Thread.sleep(1000); // 1 sec
}
}
doInBackground()
{
// your code
isDone = true;
}
onPostExecute()在主线程上执行,而不是在后台线程上执行。