2012-03-23 37 views
5

Tôi muốn sử dụng AsyncTask để kiểm tra InetAddress, chẳng hạn như trong mã bên dưới. Biến tempInet là biến toàn cầu cho biết trang web có thể liên lạc được hay không.Làm thế nào để hủy bỏ một AsyncTask Android sau một khoảng thời gian nhất định? (Ví dụ 10 giây)

Tôi bắt đầu AsyncTask bằng mã ... mới InetAsyncTask(). Execute ("www.facebook.com");

Vấn đề của tôi là tôi muốn AsyncTask tự hủy sau (nói) 10 giây.

Một số câu hỏi khác đề xuất sử dụng phương thức get (10, TimeUnit.SECONDS). Tôi muốn làm điều này nhưng không chắc chắn nơi/làm thế nào để đưa các phương pháp nhận được. Với thực thi? Trong phương thức doInBackground?

Ngoài ra, phương thức get() có chặn luồng chính không? Nếu có, điểm của nó là gì?

Bất kỳ trợ giúp nào được đánh giá cao.

class InetAsyncTask extends AsyncTask<String, String, Boolean> { 



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

     try {     
       InetAddress.getByName("www.facebook.com"); 
       return true;   

       } catch (UnknownHostException e) { 
        return false; 
       } 

    } //end doInBackground function 



    protected void onPostExecute(Boolean... result) { 

      tempInet = result[0]; 

    } 


    } //end class 

Câu hỏi liên quan

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Android Developers AsyncTask Documentation

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

Trả lời

1

Bạn nên thực hiện một handler mà hủy bỏ AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

Gởi nhắn trì hoãn để Handler này như :

Handler.sendMessageDelayed(msg, delayMillis) 

private android.os.Handler mHandler = new android.os.Handler() { 

    @Override 
    public void handleMessage(Message msg) { 
     (Your AsyncTask object).cancel(true); 
    } 
} 
0

Để trả lời câu hỏi của bạn. Mã để sử dụng với get() là như sau:

Boolean isHost = new AsyncTask<String, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(String... params) { 
       try {     
        InetAddress.getByName(params[0]); 
        return true;   
       } catch (UnknownHostException e) { 
        return false; 
       } 
      } 
     }.execute("www.facebook.com").get(PING_TIME, TimeUnit.MILLISECONDS); 

Phương thức get chặn chuỗi người gọi miễn là kết quả cần được trả lại. Do đó, bạn chỉ nên sử dụng nó trong các tình huống thử nghiệm. Nếu bạn muốn nhận được câu trả lời không đồng bộ, hãy bắt đầu như sau (đây là một trong các ví dụ của tôi, bạn sẽ phải thay đổi nó cho mục đích của mình):

private AsyncTask<Void, Void, Boolean> mAsyncTask; 

private android.os.Handler timeHandler = new android.os.Handler() { 
@Override 
public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     // react here or... 
     mAsyncTask.cancel(true); 
    } 
}; 

public void pingServer() { 

    timeHandler.sendEmptyMessageDelayed(1, PING_TIME);   
    mAsyncTask = new AsyncTask<Void, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(Void... params) { 
       // stop the time handler 
       timeHandler.removeMessages(1); 
       return restService.pingServer(); 
      } 

      @Override 
      protected void onPostExecute(Boolean isOnline) { 
       super.onPostExecute(isOnline); 
       // use result after execution (e.g.: send to callback) 
      } 


      @Override 
      protected void onCancelled(Boolean aBoolean) { 
       super.onCancelled(aBoolean); 
       // ...react here 
      } 
     }.execute(); 
} 
Các vấn đề liên quan