【问题标题】:AsyncTask doInBackground will not finish/hangsAsyncTask doInBackground 不会完成/挂起
【发布时间】: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 好像在那之前就停止工作了。

标签: android android-asynctask


【解决方案1】:

您正尝试从 UI 线程以外的线程创建和启动 AsyncTask。不支持:

http://developer.android.com/reference/android/os/AsyncTask.html

请参阅标题为“线程规则”的部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多