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

onProgressからプログレスバーを安全にメイジできるAsyncTaskを使用するだけです。UIスレッド以外のスレッドからUI要素を変更することはできませんが、UIスレッドで長期的な操作を行うことはできません。AsyncTaskがあなたの答えです。

于 2012-12-05T10:12:31.767 に答える
1

問題は、メインスレッド以外のスレッドでUI操作を実行しようとしていることです。

そのためのハンドラーを使用できます。最初にハンドラーを宣言します。

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

次に、DBを作成するスレッドから次のように呼び出します。handler.sendEmptyMessage(0);

于 2012-12-05T10:12:45.227 に答える