1

現在、アクティビティの 1 つを開始するときに、いくつかの Web ページにアクセスし、そこからダウンロードする必要があります (約 8000 行の Json を含む)。そのすべてのコードにはかなりの時間がかかります。現在、コードはすべてこのようなものです。

@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("Checking for updates...") の後に GUI が表示されるにもかかわらず、Gui が表示されるまでに非常に長い時間がかかることです。実際には、text.setText("Downloading update..") 行またはそれを超えるまで表示されません。それを行う方法についてさらに情報を探していたときに、この画像を見つけました: http://developer.android.com/images/activity_lifecycle.png

GUIを取得するには時間がかかりすぎるため、onCreateで実行したくないことはよくわかっています。アクティビティを開始するたびに 8000 行以上のファイルをダウンロードしたくないため、onStart または onResume でも使用できません。

では、このコードをどこで実行すればよいでしょうか? (UpdateChecker と UpdateMods は 2 つの ASyncTask です)

4

1 に答える 1

5

あなたの問題はここにあります:

if (update.get() == true)

つまり、実際には、「メイン アプリケーション スレッドをブロックし、doInBackground()完了するまで UI をフリーズする」ということです。

その行を取り除きます。onPostExecute()代わりに、 のタスクの完了に基づいて UI を変更しますAsyncTask

于 2013-04-30T15:05:48.493 に答える