2013-04-30 152 views
1

当我开始我的一项活动时,我希望它能够访问多个网页并从那里下载东西(包括约8000行Json)。所有这些代码都需要一段时间。目前代码都是这样的。在gui中加载代码

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_loading_mods); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
    { 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    // gets ad from google 
    AdView adView = (AdView) this.findViewById(R.id.ad); 
    adView.loadAd(new AdRequest()); 

    // prepare for a progress bar dialog 
    bar = (ProgressBar) (this.findViewById(R.id.progressBar1)); 
    DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int width = dm.widthPixels; 
    bar.setMinimumWidth((width/5 * 2)); 
    bar.setMax(3); 
    bar.setVisibility(View.VISIBLE); 

    TextView text = (TextView) findViewById(R.id.toMods); 
    text.setText("Checking for updates..."); 

    UpdateChecker update = new UpdateChecker(); 
    update.execute(getBaseContext()); 

    try 
    { 
     if (update.get() == true) 
     { 
      bar.setMax(5); 
      text.setText("Downloading update.."); 
      UpdateMods updater = new UpdateMods(); 
      updater.execute(getBaseContext()); 
     } 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (ExecutionException e) 
    { 
     e.printStackTrace(); 
    } 
} 

现在的问题是,它需要一个很长的时间去桂露面,即使(据我所知)这是text.setText(“检查更新...”之后完成) 但是,gui实际上并没有显示出来,直到它在text.setText(“Downloading update ..”)行之后。 当我搜索一个有关如何做一些更多的信息,我发现这个图片: http://developer.android.com/images/activity_lifecycle.png

我几乎知道,我不希望它在运行的onCreate,因为这将需要很长时间才能拿到GUI。 onStart或onResume也不可能,因为我不希望它每次开始活动时下载8000+行文件。

那么我应该在哪里运行此代码? (UpdateChecker和UpdateMods为2个ASyncTasks)

+0

如果你在你的Activity类中定义了你的AsyncTask,那么你可以更新你的gui,当onPostExecute被AsyncTask调用时 – edoardotognoni 2013-04-30 15:06:18

+0

如果你在执行后立即立即调用get(),那么asynctask有什么意义? – njzk2 2013-04-30 15:28:25

+0

我无法将任何一个ASyncs的代码放置在Activity代码中,因为它使用的URL不能在主线程中完成,并且必须位于ASync中。 – Wuppy29 2013-04-30 19:21:22

回答

5

你的问题是在这里:

if (update.get() == true) 

即说,实际上, “阻止主应用程序线程并冻结UI,直到doInBackground()完成”。

摆脱那条线。请根据AsyncTask的中的任务完成对UI进行修改。