0

私はAndroidの完全な初心者なので、質問のために私を石にしないでください。しかし、私は多くのスレッドを調べましたが、見つけられなかった、または答えを理解できなかった可能性が高い.

最初にインターネットから基本的なデータと画像をダウンロードする必要があるメインのアクティビティがあります。別のスレッドにある画像をロードするので、起動が遅くなりません。ただし、主要なデータ (一部のテキストと画像へのリンク) にも時間がかかります。

私の問題は、すべての変数の初期化 setContentView(R.layout.main); の直後に onCreate アクティビティにあることです。次に、キャッシュファイルが存在するかどうかを確認し、作成されていない場合は日付をダウンロードします(すべてが機能しています)...しかし、すべてのコードが完了するとレイアウトが表示されます! 私はコードの開始時にprogressBarを試しました。別のスレッドをメインスレッドに接続して結合しようとしましたが、ainスレッドのコードが終了するまで、画面は常に空白のままです(ラベルのみ)。私の問題は理解でき、おそらくばかげており、私のコードを必要としないと思います。

私がしたいのは...アプリケーションの開始直後に初期レイアウトを表示することです.最も重要で不可欠なタスクが完了した後、コンテンツを含むレイアウトを表示します...次に、画像の遅延読み込みを処理します(私がそれを理解し次第)。

したがって、私にとって最も重要なことは、コードが実行される前に何かを強制的に表示することです...

あなたの簡単な答えに感謝します。

これは私のonCreateコードです。問題は、アプリの起動直後にlayout.initを表示したいことです(「最初の起動時はお待ちください...」のようなものがあります)。レイアウト.メイン ...

利用規約タブとそれにリンクされているものはすべて無視してください (ニュース タブのみ)

    @Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    context = this;
    setContentView(R.layout.init);

    newsListView = (ListView) findViewById(R.id.novinky);
    termsListView = (ListView) findViewById(R.id.terminovka);

    File data_dir = new File(Environment.getExternalStorageDirectory() + "/" + Data.DATA_DIR);
    FileUtilities.DeleteRecursive(data_dir);

    if(!checkDataFiles()){
        createDataFiles();
        try {
            updateDataFiles(Data.NEWS_ONPAGE);
        } catch (IOException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
        }

    }

    imagesLoadingThread.start();

            setContentView(R.layout.main);

    newsVals = MyFunctions.readNewsData(Data.NEWS_ONPAGE);

    newsListView.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

          Bundle bundle = new Bundle();
          bundle.putLong("id", id);
          Intent newActivity = new Intent(view.getContext(),NewsActivity.class);
            newActivity.putExtras(bundle);
            startActivity(newActivity);               
          }                 
    });

    newsListView.setAdapter(new NewsAdapter(context, newsVals));        

    termsVals=MyFunctions.connectArrayValues(items, items, "#");
    termsVals=MyFunctions.connectArrayValues(termsVals, descrs, "#");

    termsListView.setAdapter(new TermsAdapter(context, termsVals)); 


    final TabHost tabs=(TabHost)findViewById(R.id.tabhost);

    tabs.setup();

    TabHost.TabSpec spec=tabs.newTabSpec("newstab");
    spec.setContent(R.id.novinky);
    spec.setIndicator(getText(R.string.news));
    tabs.addTab(spec);

    TabHost.TabSpec spec2=tabs.newTabSpec("termstab");
    spec2.setContent(R.id.terminovka);
    spec2.setIndicator(getText(R.string.terms));
    tabs.addTab(spec2); 
} 
4

1 に答える 1

0

あなたは正しい方向に進んでいました。何かに時間がかかるときはいつでも、別のスレッドでそれを実行したいと思います。どうやら問題は、スレッドをメインスレッドに結合しようとしたことです。スレッドに参加すると、参加したスレッドが完了するまでメインスレッドの処理が停止します。

onCreateメソッドでAsyncTaskを作成し、すべての重い処理をAsyncTaskdoInBackgroundメソッドに配置することをお勧めします。AsyncTaskにはバックグラウンドスレッドがあり、UIをフリーズすることなくバックグラウンドスレッドからメインスレッドに更新を送信するのに役立つ機能も組み込まれています。

于 2012-08-06T21:28:40.967 に答える