仅在活动运行时进行操作

时间:2015-03-24 17:01:13

标签: android android-activity

我有一个加载活动,它对服务器和转换数据的请求很少。 此活动的布局只是简单的徽标图片和progressBar

我的所有操作都是在onCreate()中完成的,根据收到的服务器请求,我开始了不同的活动:

if (request == 1) { start activity A} 
else { start activity B}

问题是加载需要2-3秒,并且在活动的视图进入UI之前,操作甚至在onResume()之前进行。

所以它只是空白的活动,它做了一些工作。

如何确保仅在活动完成创建后才进行这些操作?

3 个答案:

答案 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()在主线程上执行,而不是在后台线程上执行。