我有一个动态创建所有用户界面的函数。
如何在我的函数执行时显示对话框进度,然后在我的函数完成用户界面时关闭对话框?
这是我的代码示例:
对不起,我是android的新手,我很难理解一些代码......我会在这里写我的代码......
我有这个功能:
public void principal() {
//CODE TO CREATE ALL THE USER INTERFACE DYNAMICALLY
}
我有这样的 asyncTask:
public class EjecutarTarea extends AsyncTask<Void, Void, Void>
{
protected void onPreExecute() {
dialog = new ProgressDialog(StadioNenaActivity.this);
dialog.setMessage("Cargando..");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
protected Void doInBackground(Void... unused) {
Principal();
return null;
}
@Override
protected void onProgressUpdate(Void... unused) {
}
@Override
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
}
当我在 onCreate 中执行异步任务时,它崩溃了:
new EjecutarTarea().execute();
最佳答案
使用 AsyncTask .它提供了一种在后台加载内容并将 View 粘贴到主线程中的奇妙而简单的方法。
这是我的 AsyncTask 的示例:
private class LoadingTask extends AsyncTask<Void, Integer, Void> {
private ProgressBar mProg;
private TextView mLoadingText;
@Override protected void onPreExecute() {
mProg = (ProgressBar)findViewById(R.id.launcherbar_loadprogress);
mProg.setTouchDelegate(null);
mProg.setClickable(false);
mProg.setLongClickable(false);
mProg.setOnTouchListener(null);
mProg.setMax(100);
mLoadingText = (TextView) findViewById(R.id.launcheractivity_loadingwhat);
}
@Override protected Void doInBackground(Void... voids) {
try { Thread.sleep(1000); } catch (InterruptedException e) { }
setProgressAndSleep(R.string.loading_log, 29, 250);
LOG.setContext(LauncherActivity.this);
LOG.setDebug(true);
setProgressAndSleep(R.string.loading_database, 43, 250);
AppionDatabase.setContext(LauncherActivity.this);
setProgressAndSleep(R.string.loading_sensors, 57, 250);
Sensor.init(LauncherActivity.this);
setProgressAndSleep(R.string.loading_jobs, 71, 250);
Job.init(LauncherActivity.this);
setProgressAndSleep(R.string.loading_workbenches, 86, 250);
WorkbenchState.init(LauncherActivity.this);
setProgressAndSleep(R.string.loading_application_state, 100, 250);
ApplicationState.setContext(LauncherActivity.this);
startService(new Intent(LauncherActivity.this, BluetoothConnectionService.class));
return null;
}
@Override public void onProgressUpdate(Integer... prog) {
mLoadingText.setText(prog[0]);
mProg.setProgress(prog[1]);
}
@Override public void onPostExecute(Void voids) {
startActivity(new Intent(LauncherActivity.this, HomescreenActivity.class));
}
private void setProgressAndSleep(int text, int progress, int duration) {
try {
publishProgress(new Integer[] {text, progress});
Thread.sleep(duration);
} catch (InterruptedException e) {
LOG.e(TAG, "Failed to sleep thread while loading Application Contexts!", e);
}
}
}
编辑注意我建议不要保留 setProgressAndSleep(int, int int)
方法。我只使用它是因为它加载速度太快,我真的很想要加载栏。 :-P
关于android - 如何在 android 的线程中运行我的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730404/