2013-03-22 85 views
1

我有一個應用程序,我需要使用AsyncTask,但我遇到的問題是主線程太遠,並最終崩潰我的應用程序,因爲我的Connect1線程尚未檢索信息,但尚需繼續。我想知道如何讓線程等待AsyncTask線程終止,然後主線程可以繼續。多線程錯誤

代碼:

private void gNameOriginTag() { 

    TextView tV; 

    Connect1 connect1 = new Connect1(); 
    connect1.execute(); 

    // Set the long name for the chosen. 
    tV = (TextView) view.findViewById(R.id.gLName); 
    tV.setText(columns.get(4));  //<<<< Error is here. 

    .... 
} 

CONNECT1的AsyncTask:

private class Connect1 extends AsyncTask<String, Void, String>{ 

    @Override 
    protected String doInBackground(String... params) { 

     Connection conn = null; 
     Statement stmt = null; 

     try { 
      // STEP 2: Register JDBC driver 
      Class.forName(JDBC_DRIVER); 

      // STEP 3: Open a connection 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 

      // STEP 4: Execute a query 
      stmt = conn.createStatement(); 

      // STEP 5a: Extract data from result set 
      ResultSet rs = stmt.executeQuery("SELECT * FROM gs WHERE name ='" 
        + gSelected + "'"); 
      ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData(); 
      int x = 1; 
      while (rs.next()) { 
       while (x < rsmd.getColumnCount()) { 

        // Retrieve Strings & Add it to the ArrayList. 
        columns.add(rs.getString(x)); 
        x++; 
       } 

      } 
      rs.close(); 
      stmt.close(); 
      conn.close(); 

     } catch (SQLException se) { 
      // Handle errors for JDBC 
      se.printStackTrace(); 
     } catch (Exception e) { 
      // Handle errors for Class.forName 
      e.printStackTrace(); 
     } finally { 
      // finally block used to close resources 
      try { 
       if (stmt != null) 
        stmt.close(); 
      } catch (SQLException se2) { 
      }// nothing we can do 
      try { 
       if (conn != null) 
        conn.close(); 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      }// end finally try 
     }// end try 

     return ""; 
    } 
} 

爲什麼我這樣做的原因是由於Android 2.3.3不從我學到了運行在主線程上的MySQL我試圖學習AsyncTask,所以我在「代碼:」中試圖完成的是以某種方式使主線程等待/連接(我也讀過,暫停主線程是壞的,所以我更加迷失在做什麼)Connect1線程完成以便:

tV.setText(columns.get(4)); 

可以檢索到,所以我的應用程序不會崩潰。

+1

把你需要的代碼在onPostExecute()中的AsyncTask結束後運行。 – 2013-03-22 09:32:00

+0

move'tV.setText(columns.get(4));'改爲onPostExecute()方法方法 – 2013-03-22 09:34:02

+0

afetr asynk.execute()Asyntask start doInBackGround()爲線程,並且在完成onPostExecute()調用後,運行主線程,你應該在後期編寫你所有的UI更新,它作爲處理程序工作。 – 2013-03-22 09:40:50

回答

1

定義AsyncTask完成時調用的方法,然後再次在UIThread上運行。

MainThread:調用的AsyncTask

的AsyncTask:做的工作,並呼籲doWhenDoneWithBackgroundWork

doWhenDoneWithBackgroundWork:確實上MainThread一些工作再次

1

您可以編寫代碼上的異步任務的onPostExecute方法。