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));
アプリがクラッシュしないように取得できます。