2012-03-23 13 views
5

मैं नीचे दिए गए कोड में एक InetAddress की जांच करने के लिए AsyncTask का उपयोग करना चाहता हूं। परिवर्तनीय tempInet एक वैश्विक चर है जो इंगित करता है कि वेबसाइट संपर्क करने योग्य थी या नहीं।एक निश्चित समय के बाद एंड्रॉइड AsyncTask को कैसे रद्द करें? (उदाहरण के लिए 10 सेकंड)

मैं कोड के साथ AsyncTask शुरू करता हूं ... नया InetAsyncTask() निष्पादित करें ("www.facebook.com");

मेरी समस्या यह है कि मैं AsyncTask को 10 सेकंड के बाद खुद को रद्द करना चाहता हूं।

कुछ अन्य प्रश्न प्राप्त करें (10, TimeUnit.SECONDS) विधि का उपयोग करने का सुझाव देते हैं। मैं यह करना चाहता हूं लेकिन यह सुनिश्चित नहीं करता कि प्राप्त विधि कहां/कैसे रखी जाए। निष्पादित करने के साथ? DoInBackground विधि में?

इसके अलावा, क्या मिलता है() विधि मुख्य धागे को अवरुद्ध करता है? अगर ऐसा होता है, तो इसका क्या मतलब है?

किसी भी मदद की सराहना की।

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 

संबंधित प्रश्न

Android - Setting a Timeout for an AsyncTask?

stop async task after 60 second

Android डेवलपर AsyncTask प्रलेखन

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

उत्तर

1

आप एक हैंडलर जो Asynctask रद्द करना चाहिए (http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean))

की तरह इस हैंडलर के लिए एक देरी संदेश भेजें :

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

अपने प्रश्न का उत्तर देने के लिए।

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); 

प्राप्त विधि ब्लॉक फोन करने वाले धागे के रूप में लंबे समय के परिणाम वापस किए जाने की आवश्यकता के रूप में:() प्राप्त के साथ उपयोग करने के लिए कोड का पालन है। इसलिए आपको केवल परीक्षण स्थितियों में इसका उपयोग करना चाहिए। यदि आप एसिंक्रोनस उत्तर प्राप्त करना चाहते हैं तो इसे निम्नानुसार शुरू करें (यह मेरे उदाहरणों में से एक है, आपको इसे अपने उद्देश्य के लिए बदलना होगा):

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(); 
} 
संबंधित मुद्दे