2012-12-05 2 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

어떤 종류 : DB 당신이 전화를 생성 스레드에서 그런

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

: 먼저 핸들러를 선언? 작동하지 않는 코드에서 AsyncTask를 사용하고 있습니까? – piotrpo

+0

치명적인 예외 : 스레드 8 android.view.ViewRoot $ CalledFromWrongThreadException :보기 계층 구조를 만든 원래 스레드 만 해당보기를 만질 수 있습니다. /// 내가 쓰레드 – Mirek

답변

1

문제는 메인 스레드가 아닌 다른 스레드에서 UI 작업을하려고한다는 것입니다.

처리기를 사용할 수 있습니다. 오류의 handler.sendEmptyMessage(0);

+0

나는 어제 그랬다. onCreate()에 코드를 작성한 다음 스레드 (스레드는 데이터베이스 만 작성 함)를 실행 한 다음 나머지 코드를 실행하는 함수가 있습니다. 오류없이 작동하지만 "텍스트"는 설정되지 않습니다. 나는 빈 TextView 있어요. 어떻게 작동하는지 잘 모르지만 "텍스트"가 설정되어있는 동안 스레드가 여전히 작동 중입니다. – Mirek

+0

@Mirek 어제 처리기를 사용 했습니까? 나는 너의 대답을 얻지 못한다. – Warpzit

+0

예. 위의 Ok 코드 업데이트, 곧 – Mirek

1

AsyncTask you 진행 상황에서 진행률 표시 줄을 안전하게 만들 수 있습니다. UI 스레드 이외의 스레드에서 UI 요소를 변경할 수는 없지만 UI 스레드에서 오래 지속되는 작업을 수행 할 수는 없습니다. AsyncTask가 당신의 대답입니다.

+0

을 사용했다. 나는 지난주에 AsyncTask를 사용하려고했지만 몇 가지 문제가 있었다. 예 : 와 함께 db = new DatabaseHandler (this); 나는 그것을 작동시키기 위해 "this"대신에 무엇이 있어야하는지 모른다. – Mirek

+0

@Mirek 컨텍스트는 생성자를 통해 asynctask에 전달할 때 사용할 수있는 컨텍스트입니다. – Warpzit

+0

AsyncTask는 Activity의 내부 클래스 일 가능성이 큽니다. 따라서 "this"는 MyActivity가 아닌 AsyncTask를 의미합니다. 난 당신의 코드 구조와 옳다 경우 나는 당신의 충고를 받아 다시 AsyncTask를 하나와 함께 할 것을 시도 할 것이다 MyActivity.this – piotrpo