我有一個應用程序,我需要使用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));
可以檢索到,所以我的應用程序不會崩潰。
把你需要的代碼在onPostExecute()中的AsyncTask結束後運行。 – 2013-03-22 09:32:00
move'tV.setText(columns.get(4));'改爲onPostExecute()方法方法 – 2013-03-22 09:34:02
afetr asynk.execute()Asyntask start doInBackGround()爲線程,並且在完成onPostExecute()調用後,運行主線程,你應該在後期編寫你所有的UI更新,它作爲處理程序工作。 – 2013-03-22 09:40:50