多线程错误

时间:2013-03-22 09:31:19

标签: java android android-asynctask

我有一个应用程序,我需要使用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)); 

可以被检索,因此我的应用程序不会崩溃。

2 个答案:

答案 0 :(得分:1)

定义AsyncTask完成后调用的方法,然后再次在UIThread上运行。

MainThread:调用AsyncTask

AsyncTask:工作并调用doWhenDoneWithBackgroundWork

doWhenDoneWithBackgroundWork:在MainThread上再做一些工作

答案 1 :(得分:1)

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