2012-12-05 36 views
0

您可以幫助我在創建數據庫期間更改一段代碼以顯示progresDialog或一些信息。我試圖用Thread來做到這一點,但沒有成功。當我將大部分代碼放入線程時,出現錯誤,在創建數據庫之前只設置了db.createDataBase()「text」。progressDialog將創建數據庫

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

什麼樣的錯誤:

Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // do UI stuff } }; 
從你的線程創建DB你叫

呢?你在不工作的代碼中使用AsyncTask嗎? – piotrpo

+0

致命異常:Thread-8 android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。 ///我使用線程 – Mirek

回答

1

你的問題是你正在嘗試在除主線程之外的另一個線程上執行UI操作。

你可以使用一個處理程序。首先聲明一個處理程序:handler.sendEmptyMessage(0);

+0

昨天我做到了。我已經在onCreate()中編寫代碼,然後有一個函數運行線程(線程只創建數據庫),然後是代碼的其餘部分。它的工作原理沒有錯誤,但「文本」沒有設置。我得到了空的TextView。我不太清楚它是如何工作的,但是在設置「文本」時線程仍然可以工作。 – Mirek

+0

@Mirek你昨天是否使用過處理程序?我沒有得到你的迴應。 – Warpzit

+0

是的。好的代碼更新上面,很快 – Mirek

1

只要使用AsyncTask你可以安全地將進度條從進度條上拖拽到進度條上。 另一方面,您不能從UI線程以外的線程更改UI元素,但是您無法在UI線程中執行長時間的操作。 AsyncTask是你的答案。

+0

我上週試過使用AsyncTask,但遇到了一些問題。例如。用db = new DatabaseHandler(this);我不知道應該用什麼來代替「這個」來使它工作。 – Mirek

+0

@Mirek你的上下文,這是你的活動,當你通過構造函數創建它時,你可以將它傳遞給asynctask。 – Warpzit

+0

AsyncTask可能是您活動中的內部類。所以「this」的意思是AsyncTask,而不是MyActivity。如果我對你的代碼構建正確(AT是MyActivity的內部類),請嘗試MyActivity.this – piotrpo