在主线程开始之前查看布局

时间:2012-08-06 21:22:42

标签: android

我是android的全新手,所以请不要问我这个问题,但是我经历了很多线程并没有找到,或者哪个更可能没有理解答案。

我有主要活动应该在第一次开始下载来自互联网的基本数据和图像。我在单独的线程上加载图像,因此它不会减慢启动速度。但主要数据(一些文本和图像链接)也需要一段时间。

我的问题是,在所有变量初始化后,我在onCreate活动中初始化setContentView(R.layout.main);然后检查缓存文件是否存在,如果没有创建它们并将日期下载到它们中(everithing正在工作)......但是布局显示所有代码完成后!我已经在代码开始时尝试了progressBar,我已尝试使用separed线程并加入主线程,但屏幕始终保持空白(仅限标签),直到ain线程中的代码完成。我认为我的问题是无法解决的,可能是愚蠢的,并且没有重新审视我的代码。

我想要的是......在应用程序启动后立即显示init布局,在完成最重要且最基本的任务以显示内容布局之后......然后我将处理一些Lazy加载图像(一旦我低估它)。

所以对我来说最重要的是在任何代码执行之前强制显示一些内容......

Thanx为您提供简单的答案。

好的,这是我的onCreate代码。问题是,我想在应用程序启动后立即显示layout.init(会有类似的内容 - “首次启动时请等待......”)并在下载基本数据并保存到SD卡后显示layout.main ...

请忽略条款标签以及与其关联的所有内容(仅限新闻标签)

    @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); 
} 

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。任何时候需要很长时间,你想在一个单独的线程上做。看起来问题是您尝试将线程加入主线程。如果你加入线程,它会导致你的主线程停止处理,直到连接的线程完成。

我的建议是在onCreate方法中创建AsyncTask并将所有繁重的处理放在AsyncTask doInBackground方法中。 AsyncTask有一个后台线程,还内置了一些功能,可以帮助将更新从后台线程发送到主线程,而不会冻结你的UI。