你能帮我改变一段代码来显示progresDialog或数据库创建过程中的一些信息。我试图用Thread做这个没有成功。当我将大部分代码放入线程时,我得到错误,当在创建数据库之前只设置db.createDataBase()“text”时。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myCalendar = new MyCalendar();
menu = (TextView) findViewById(R.id.poleMenu);
text = (TextView) findViewById(R.id.glownePoleTekstowe);
menu.setText(kalendarz.setCurrentDateOnView());
value = menu.getText().toString();
db = new DatabaseHandler(this);
try {
// separate class to load database
// MOST IMPORTANT
db.createDataBase();
} catch (IOException ioe) {
throw new Error("nie można utworzyć bazy danych");
}
dane = db.getDataFromDate(value);
db.close();
try {
log = dane.getTekst();
}catch(Exception e) {System.out.println(e);}
text.setText(log);
}
使用线程和处理程序进行更新:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
kalendarz = new Kalendarz();
menu = (TextView) findViewById(R.id.poleMenu);
text = (TextView) findViewById(R.id.glownePoleTekstowe);
menu.setText(kalendarz.setCurrentDateOnView());
value = menu.getText().toString();
db = new DatabaseHandler(this);
// thread
ladujDane();
dane = db.getDaneFromDate(value);
db.close();
try {
log = dane.getTekst();
}catch(Exception e) {System.out.println(e);}
text.setText(log);
}
// ------------------------------------------
public void ladujDane() {
mLoadDBHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
progressDialog.dismiss();
}
};
progressDialog = ProgressDialog.show(
this,
"Ładowanie danych", "Proszę chwilkę poczekać",
true,
false);
Thread t = new Thread(new LoadDBThread());
t.start();
}
// ----------------------------------------
private class LoadDBThread implements Runnable
{
public void run()
{
try {
db.createDataBase();
} catch (IOException ioe) {
throw new Error("nie można utworzyć bazy danych");
}
mLoadDBHandler.sendEmptyMessage(0);
}
}
答案 0 :(得分:1)
只需使用AsyncTask,您就可以从它的onProgress安全地进行mage进度条。 您无法从UI线程以外的线程更改UI元素,另一方面您无法在UI线程中执行持久的操作。 AsyncTask是你的答案。
答案 1 :(得分:1)
您的问题是您正在尝试在主线程之外的其他线程上执行UI操作。
您可以使用处理程序。首先声明一个处理程序:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// do UI stuff
}
};
然后从创建数据库的线程中调用:handler.sendEmptyMessage(0);