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)); 

アプリがクラッシュしないように取得できます。

4

2 に答える 2

1

終了時にAsyncTaskによって呼び出され、UIThreadで再度実行されるメソッドを定義します。

MainThread:AsyncTaskを呼び出します

AsyncTask:作業を行い、doWhenDoneWithBackgroundWorkを呼び出します

doWhenDoneWithBackgroundWork:MainThreadで再度作業を行います

于 2013-03-22T09:33:49.153 に答える
1

onPostExecuteAsync タスクのメソッドにコードを記述できます。

于 2013-03-22T09:34:57.043 に答える