0

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

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

我的问题是我的 onCreate 活动在所有变量初始化 setContentView(R.layout.main); 然后检查缓存文件是否存在,如果没有创建它们并将日期下载到它们中(一切正常)......但布局显示在所有代码完成后!我在代码开始时尝试了progressBar,我尝试了分离线程并加入主线程,但在线程中的代码完成之前,屏幕始终保持空白(仅带有标签)。我认为我的问题是可以理解的,可能很愚蠢,并且不需要我的代码。

我想要的是......在应用程序启动后立即显示初始化布局,在完成最重要和最基本的任务以显示内容布局......然后我将处理一些延迟加载的图像(如一旦我理解它)。

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

感谢您的简单回答。

好的,这是我的 onCreate 代码。问题是,我想在应用程序启动后立即显示 layout.init(会有类似 - “第一次启动时请稍候......”)并且在下载基本数据并保存到 sdcard 以显示布局.主...

请忽略条款标签和与之相关的所有内容(仅限新闻标签)

    @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并将所有繁重的处理放在 AsyncTask doInBackground 方法中。AsyncTask 有一个后台线程,并且还具有内置功能,可帮助将更新从后台线程发送到主线程,而不会冻结您的 UI。

于 2012-08-06T21:28:40.967 回答