Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Asynctask即使在UI线程中初始化,也不会到达onPostExecute_Java_Android_Multithreading_Android Asynctask - Fatal编程技术网

Java Asynctask即使在UI线程中初始化,也不会到达onPostExecute

Java Asynctask即使在UI线程中初始化,也不会到达onPostExecute,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在制作一个应用程序,在一个单独的类中使用asynctask查询数据库。此类接受一个字符串,传递应该是查询的字符串,并将结果作为ResultSet获取。然后,应该将这个结果集传递给onPostExecute,在那里它使用一个接口将结果返回到主线程。但是,使用log命令,我发现asynctask从未到达onPostExecute。有人能帮我吗 我的Asynctask类getMyResults不再使用,doInBackground中的代码与此无关: 编辑:编辑 public class DBCon

我正在制作一个应用程序,在一个单独的类中使用asynctask查询数据库。此类接受一个字符串,传递应该是查询的字符串,并将结果作为ResultSet获取。然后,应该将这个结果集传递给onPostExecute,在那里它使用一个接口将结果返回到主线程。但是,使用log命令,我发现asynctask从未到达onPostExecute。有人能帮我吗

我的Asynctask类getMyResults不再使用,doInBackground中的代码与此无关:

编辑:编辑

public class DBConnector extends AsyncTask <String, Void, ResultSet> {

    private Connection con;
private Statement st;
private ResultSet rs;
public CallBackListener DBlistener;



public ResultSet getMyResults(){
    return rs;
}

//public


@Override
protected ResultSet doInBackground(String... params) {

String Query = params[0];
        System.out.println("Starting DBConnector");

//Code to get the database connection working

    try{
        rs = st.executeQuery(Query);
        System.out.println("Records from Database");
        /*
        while(rs.next()){

            String StudentID = rs.getString("StudentID");
            String StudentName = rs.getString("StudentName");
            String StudentPassword = rs.getString("StudentPassword");
            System.out.println("Student ID: "+StudentID+"   Student Name: "+StudentName+"    Student Password: "+StudentPassword);
        }
        */
    }catch(Exception ex){
        System.out.println(ex);
    }

    System.out.println("Finished DBConnector");


    return rs;
}

@Override
protected void onPostExecute(ResultSet rs) {
    System.out.println("THIS IS WHERE IT ALL GOES WRONG");
    DBlistener.processFinish(rs);
}
最后,在我的活动中,我省略了所有不相关的代码:

public class CheckTimetable extends Activity implements CallBackListener {
    ResultSet rs= null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_check_timetable);

        try {
            Class.forName("android.os.AsyncTask");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//这是作为解决我的问题的建议添加的,但没有效果

    btnBuildTimetable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                BuildTable(rows, cols, "A"); //need mapping system to get TutorID from spinner and send it here
//在我的原始代码中,行和列是从2个编辑文本中获得的整数 }

        }
    });

}


private void BuildTable(int rows, int cols, String GivenTutorID){
DBConnector connect = new DBConnector();
String StudentID = "";
String TutorID = "";
String VenueLocation = "";
String LessonDate = "";
String LessonStartTime = "";
String LessonEndTime = "";
connect.execute("SELECT * FROM Lessons WHERE Lessons.TutorID = '"+ GivenTutorID + "';");
connect.DBlistener = this;//should use TutorID here
    /*
try {
    Thread.sleep(5000);//just used so that the resultset doesn't get no results - waits for connect.execute to finish.
}
catch (Exception e) {}
*/
    System.out.println("WE GO IN BOYS");
while (rs == null ){
    try {
        Thread.sleep(100);
    } catch (Exception e){}
}

rs = connect.getMyResults();

for (int i=1; i<=rows; i++){
    TableRow row = new TableRow(this);
    row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
    for (int j=1; j<=cols;j++){
        try {
            while (rs.next()) {
                StudentID = rs.getString("StudentID");
                TutorID = rs.getString("TutorID");
                VenueLocation = rs.getString("VenueLocation");
                LessonDate = rs.getString("LessonDate");
                LessonStartTime = rs.getString("LessonStartTime");
                LessonEndTime = rs.getString("LessonEndTime");
            }
        }catch(Exception ex) {
            System.out.println("caught exception");
        }
        TextView tv = new TextView(this);
        tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        tv.setBackgroundResource(R.drawable.cell_shape);
        tv.setPadding(5, 5, 5, 5);
        tv.setText(LessonDate);
        System.out.println(LessonDate);
        System.out.println("Cell set");

            row.addView(tv);

        }
tblTutorTimetable.addView(row);
    }
    }
        @Override
        public void processFinish(ResultSet output) {
            rs = output;
            System.out.println("WE MADE IT");
        }
当按下BuildTable按钮时,它将遍历代码,执行asynctask,然后等待结果集不为null。asynctask一直运行到doInBackground结束的第二个线程,在此之后什么也没有发生,UI线程保持冻结状态

任何关于这个或界面的帮助都将是非常棒的

当按下BuildTable按钮时,它将遍历代码,执行asynctask,然后等待结果集不为null。asynctask一直运行到doInBackground结束的第二个线程,在此之后什么也没有发生,UI线程保持冻结状态

不要自己等待你的任务。特别是不要用thread.sleep阻塞UI线程

异步任务onPostExecute在UI线程上运行,当您自己阻塞线程时,它永远不会有机会运行


相反,以异步方式使用异步任务:让UI线程执行它正在执行的任何操作,并将控制权返回给UI线程循环器/处理程序,并在onPostExecute中使用异步任务结果更新UI。

但我的UI只能对结果集执行它需要执行的操作。起初,我有一个简单的getter来返回时间,但这同样是一个糟糕的解决方案,因为我必须简单地将UI线程冻结一段时间,以便让AsyncTask有时间从我的云数据库获取结果。从AsyncTask检索到的结果集一经检索,我如何将其取回?提前谢谢
        }
    });

}


private void BuildTable(int rows, int cols, String GivenTutorID){
DBConnector connect = new DBConnector();
String StudentID = "";
String TutorID = "";
String VenueLocation = "";
String LessonDate = "";
String LessonStartTime = "";
String LessonEndTime = "";
connect.execute("SELECT * FROM Lessons WHERE Lessons.TutorID = '"+ GivenTutorID + "';");
connect.DBlistener = this;//should use TutorID here
    /*
try {
    Thread.sleep(5000);//just used so that the resultset doesn't get no results - waits for connect.execute to finish.
}
catch (Exception e) {}
*/
    System.out.println("WE GO IN BOYS");
while (rs == null ){
    try {
        Thread.sleep(100);
    } catch (Exception e){}
}

rs = connect.getMyResults();

for (int i=1; i<=rows; i++){
    TableRow row = new TableRow(this);
    row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
    for (int j=1; j<=cols;j++){
        try {
            while (rs.next()) {
                StudentID = rs.getString("StudentID");
                TutorID = rs.getString("TutorID");
                VenueLocation = rs.getString("VenueLocation");
                LessonDate = rs.getString("LessonDate");
                LessonStartTime = rs.getString("LessonStartTime");
                LessonEndTime = rs.getString("LessonEndTime");
            }
        }catch(Exception ex) {
            System.out.println("caught exception");
        }
        TextView tv = new TextView(this);
        tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT));
        tv.setBackgroundResource(R.drawable.cell_shape);
        tv.setPadding(5, 5, 5, 5);
        tv.setText(LessonDate);
        System.out.println(LessonDate);
        System.out.println("Cell set");

            row.addView(tv);

        }
tblTutorTimetable.addView(row);
    }
    }
        @Override
        public void processFinish(ResultSet output) {
            rs = output;
            System.out.println("WE MADE IT");
        }