我是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);
}
答案 0 :(得分:0)
你走在正确的轨道上。任何时候需要很长时间,你想在一个单独的线程上做。看起来问题是您尝试将线程加入主线程。如果你加入线程,它会导致你的主线程停止处理,直到连接的线程完成。
我的建议是在onCreate方法中创建AsyncTask并将所有繁重的处理放在AsyncTask doInBackground方法中。 AsyncTask有一个后台线程,还内置了一些功能,可以帮助将更新从后台线程发送到主线程,而不会冻结你的UI。