我最近发现,由于我的应用程序从几个URL中提取了大量数据,因此加载主要布局需要大约3-7秒。因此,我创建了一个名为“loading”的布局来显示,这只是一个TextView,它表示“请等待数据收集......”。但是,当我运行我的应用程序时,它不会显示“加载”布局。它只是变黑了一段时间,就像以前一样,然后转到主要布局。我也试过清理项目,但它仍然这样做。这是我的Main.java的一部分:
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.loading);
populateArray();
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Set up click listeners for all buttons
View v1 = findViewById(R.id.continueButton);
v1.setOnClickListener(this);
View v2 = findViewById(R.id.colorCheck);
v2.setOnClickListener(this);
View v3 = findViewById(R.id.terms);
v3.setOnClickListener(this);
}
populateArray();
是提取互联网所有信息的方法。所以,我想,“为什么不告诉它立即将内容视图设置为'加载',让它运行populateArray();
,然后显示主要布局?”显然,我必须在这里遗漏一些东西。有什么想法吗?
=============================================== ===========================
编辑:我尝试过使用AsyncTask,但是我已经关闭了。我也得到一个警告说AsyncTask类从未使用过。这是我的代码: P.S。 ProgressDialog dialog;
是一个全球定义。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dialog = ProgressDialog.show(this, "",
"Please wait while data is collected...", true);
// Set up click listeners for all buttons
View v1 = findViewById(R.id.continueButton);
v1.setOnClickListener(this);
View v2 = findViewById(R.id.colorCheck);
v2.setOnClickListener(this);
View v3 = findViewById(R.id.terms);
v3.setOnClickListener(this);
}
和...
private class LoadData extends AsyncTask <String[][], String, String> {
@Override
protected String doInBackground(String[][]... voidThisArray) {
String voidThisString = null;
populateArray();
return voidThisString;
}
@Override
protected void onPostExecute(String voidThisString) {
setContentView(R.layout.main);
dialog.dismiss();
}
}
我会给你关闭力的LogCat,但由于某种原因,LogCat没有显示任何东西......
答案 0 :(得分:3)
您希望首先使用an AsyncTask:创建一个显示加载消息的ProgressDialog。然后AsyncTask
将在后台收集所有数据。
希望有所帮助。
private class Task extends AsyncTask<Void,Integer, Void> {
private ProgressDialog dia;
@Override protected void onPreExecute() {
dia = new ProgressDialog(MyContext.this);
dia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dia.setMessage("Loading. Please wait...");
dia.setCancelable(false);
dia.show();
// Set up preserver download stuff
}
@Override protected Void doInBackground(Void... voids) {
// perform server download stuff
}
@Override public void onProgressUpdate(Integer... prog) {
if (prog == null)
return;
dia.setProgress(prog[0]);
}
@Override protected void onPostExecute(Void voids) {
// Do any post op stuff
dia.cancel();
}
}
答案 1 :(得分:2)
您应该看到this页面,了解有关线程的信息。基本上,如果您的应用程序要执行任何长时间运行的操作,您需要它在一个线程中。您的UI已锁定,因为您在UI线程上执行此操作。
就进度更新而言,我个人使用ProgressDialog来显示发生的事情,尽管您可以构建一个自定义视图来表明这一点。
答案 2 :(得分:2)
查看AsyncTask并执行
populateArray();
在AsyncTask的doInBackground方法中。
并致电
setContentView
只有使用onPreExecute和AsyncTask的onPostExecute方法才能显示加载