【发布时间】:2013-01-12 12:41:51
【问题描述】:
当我在 doInBackground 方法中调用 lib.roomAvailable() 时,我的 AsyncTask 将无法完成。当 QueueTask 被调用时,progressDialog 将显示并且
它坚持。它应该会在 5 秒后消失。
如果我从 doInBackground 方法中删除 lib.roomAvailable(),一切都会按预期工作。为什么我在拨打lib.roomAvailable() 时会出现这种奇怪的行为?
roomAvailable() 调用另一个 AsyncTask 会不会是个问题?
public class QueueTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
private Library lib;
private String date;
private int room;
private int time;
private String user;
private String id;
public QueueTask(String date, int room, int time, String user, String id) {
this.date = date;
this.room = room;
this.time = time;
this.user = user;
this.id = id;
}
@Override
protected void onPreExecute() {
lib = new Library();
progressDialog = ProgressDialog.show(ManageRoomActivity.this, "Queuing", "Queuing process", true);
}
@Override
protected Void doInBackground(Void... params) {
int timer = 5;
while(timer > 0) {
if(lib.roomAvailable(date, room, time)) {
Log.w("RoomAvailable", "Room Available");
}
android.os.SystemClock.sleep(1000);
timer --;
Log.w("TIMER", "" + timer);
}
progressDialog.dismiss();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
progressDialog.dismiss();
Intent intent = new Intent(ManageRoomActivity.this, DatePickerActivity.class);
ManageRoomActivity.this.startActivity(intent);
}
}
编辑 1:
public boolean roomAvailable(String date, int room, int time) {
boolean available = false;
String timeString = "";
if(time < 10)
timeString = "0";
timeString = timeString + time;
String roomNum = "";
if(room < 10)
roomNum = "0";
roomNum = roomNum + room;
AsyncTask<String, Void, String> readSource = new URL_Source();
String source = "";
try {
String uri = getURI(date);
source = readSource.execute(getURI(date)).get();
String[] chunks = source.split("<td");
for(String chunk:chunks) {
if(chunk.contains(date) & chunk.contains("=Grp" + roomNum) & chunk.contains("stid=" + timeString))
available = true;
}
return available;
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return available;
}
另一个异步任务:
public final class URL_Source extends AsyncTask<String, Void, String> {
public URL_Source() {
}
protected String doInBackground(String... uri) {
try {
URL url = new URL(uri[0]);
InputStream in = url.openStream();
StringBuilder source = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while((line = reader.readLine()) != null) {
source.append(line);
}
in.close();
return source.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "ERROR";
}
}
解决方案:
我不知道 AsyncTask 是如何工作的。您不能在 AsyncTask 中调用 AsynchTask!
【问题讨论】:
-
您在删除或评论
android.os.SystemClock.sleep(1000);后尝试过吗? -
你能显示 lib.roomAvailable(date, room, time) 吗?
-
@ ρяσѕρєя 恐怕没有任何区别@ Araw 请参阅编辑 1。 @Neurenor,我不确定你想要什么样的堆栈跟踪。当前线程的?
-
您是否检查过您的应用程序没有在此处的其他异步任务中挂起:while((line = reader.readLine()) != null) { source.append(line); } ?
-
如果我在 onPreExecute() 中执行 Log.w("TEST", "" + lib.roomAvailable(date, room, time)) ,它将记录并显示正确。如果它在 doInBackground() 方法中,则不会显示日志消息。 @Araw 好像在那之前就停止工作了。