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