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 异步任务:

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

onPostExecute您可以在异步任务的方法上编写代码。

于 2013-03-22T09:34:57.043 回答