0

您能否帮我更改一段代码以在数据库创建期间显示 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);
  }
}
4

2 回答 2

1

您的问题是您试图在主线程之外的另一个线程上执行 UI 操作。

您可以为此使用处理程序。首先声明一个处理程序:

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // do UI stuff
        }
    };

然后从创建数据库的线程中调用:handler.sendEmptyMessage(0);

于 2012-12-05T10:12:45.227 回答
1

只需使用 AsyncTask,您就可以从它的 onProgress 安全地管理进度条。您不能从 UI 线程以外的线程更改 UI 元素,另一方面,您不能在 UI 线程中执行持久操作。AsyncTask 是您的答案。

于 2012-12-05T10:12:31.767 回答