2013-01-12 52 views
1

我有一個AsyncTask,當我在doInBackground方法中調用lib.roomAvailable()調用時,AsyncTask不會完成。當QueueTask被調用時,progressDialog會顯示並且堅持。它應該在5秒後消失。AsyncTask doInBackground不會完成/掛起

如果我從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; 
     } 

其他的AsyncTask:

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!

+0

你已經嘗試了一節;'? –

+0

編寫你的堆棧跟蹤 –

+0

你可以顯示lib.roomAvailable(日期,房間,時間)嗎? – Araw

回答

相關問題