2012-04-03 14 views
30

मैंने कोड का एक टुकड़ा बनाया है जो एक आईपी पता (किसी अन्य वर्ग में मुख्य विधि से) लेता है और फिर प्रत्येक के रूप में प्रत्येक को पिंग करने वाले आईपी पतों की एक श्रृंखला के माध्यम से loops। मेरे पास इस पर एक जीयूआई फ्रंट एंड है और यह क्रैश हो रहा था (इसलिए मैंने मल्टीथ्रेडिंग क्यों की है। मेरी समस्या यह है कि अब मैं अपने पिंग कोड में एक तर्क के रूप में आईपी पता नहीं ले सकता क्योंकि यह कॉल करने योग्य है। मैंने पूरी खोज की है इसके लिए और इसे पाने के लिए कोई रास्ता नहीं मिल रहा है। क्या तर्क देने के लिए कॉल करने योग्य विधि का कोई तरीका है? यदि नहीं है तो क्या मैं ऐसा करने का कोई अन्य तरीका नहीं कर रहा हूं?क्या कॉल करने योग्य विधि में कोई तर्क लेने का कोई तरीका है?

मेरा नमूना कोड:।

public class doPing implements Callable<String>{ 

public String call() throws Exception{ 

    String pingOutput = null; 

    //gets IP address and places into new IP object 
    InetAddress IPAddress = InetAddress.getByName(IPtoPing); 
    //finds if IP is reachable or not. a timeout timer of 3000 milliseconds is set. 
    //Results can vary depending on permissions so cmd method of doing this has also been added as backup 
    boolean reachable = IPAddress.isReachable(1400); 

    if (reachable){ 
      pingOutput = IPtoPing + " is reachable.\n"; 
    }else{ 
     //runs ping command once on the IP address in CMD 
     Process ping = Runtime.getRuntime().exec("ping " + IPtoPing + " -n 1 -w 300"); 
     //reads input from command line 
     BufferedReader in = new BufferedReader(new InputStreamReader(ping.getInputStream())); 
     String line; 
     int lineCount = 0; 
     while ((line = in.readLine()) != null) { 
      //increase line count to find part of command prompt output that we want 
      lineCount++; 
      //when line count is 3 print result 
      if (lineCount == 3){ 
       pingOutput = "Ping to " + IPtoPing + ": " + line + "\n"; 
      } 
     } 
    } 
    return pingOutput; 
} 
} 

IPtoPing तर्क यह है कि लिया गया था हुआ करता था

उत्तर

37

आप पारित नहीं हो सकता यह call() पर तर्क के रूप में है क्योंकि विधि हस्ताक्षर इसे अनुमति नहीं देता है।

हालांकि, आप इसे एक निर्माता तर्क के रूप में पास कर सकते हैं; जैसे एक आंतरिक वर्ग के रूप में

  • घोषित डोपिंग और यह एक का उल्लेख है:

    public class DoPing implements Callable<String>{ 
        private final String ipToPing; 
    
        public DoPing(String ipToPing) { 
         this.ipToPing = ipToPing; 
        } 
    
        public String call() throws SomeException { 
         InetAddress ipAddress = InetAddress.getByName(ipToPing); 
         .... 
        } 
    } 
    

    सकता है (मैं प्रबल कोड शैली के उल्लंघन के एक जोड़े को सुधारा है !!)

    वैकल्पिक रूप से, आप final ipToPing संलग्न गुंजाइश में, या

  • setIpToPing(String ipToPing) विधि जोड़ें।

(पिछले अनुमति देता है एक DoPing वस्तु पुनः उपयोग किया जा सकता है, लेकिन नकारात्मक पक्ष यह है कि आप धागे की सुरक्षित रूप से एक्सेस करने के लिए आपको सिंक्रनाइज़ करना होगा है।)

+0

तो .... यह यदि आप किसी अन्य समारोह जो प्रतिदेय पुनरावृति करने की कोशिश करता करने के लिए एक पैरामीटर के रूप प्रतिदेय पारित काम नहीं करेगा तर्कों की एक सरणी के खिलाफ यह पारित किया गया था ... – Michael

+0

क्या यह एक बयान या प्रश्न के रूप में है? किसी भी तरह से, मैं यह नहीं समझ सकता कि आप क्या कह रहे हैं/पूछ रहे हैं। –

5

जब आप डोपिंग स्तरीय बनाने (वर्ग के नाम में पूंजी पत्र होना चाहिए), वें में भेज कन्स्ट्रक्टर में ई आईपी पता। कॉल-विधि में इस आईपी पते का प्रयोग करें।

4

अपने doPing कक्षा में कुछ (final) क्षेत्रों, और एक निर्माता है कि उन्हें initializes रखो, तो मानों आप doPing के निर्माता को call() में उपयोग करना चाहते हैं पारित:

public class doPing implements Callable<String> { 
    private final String ipToPing; 

    public doPing(String ip) { 
     this.ipToPing = ip; 
    } 

    public String call() { 
     // use ipToPing 
    } 
} 
6

Jarle के जवाब देने के लिए जोड़ा जा रहा है - इस मामले में आपके द्वारा बनाए गए

final int arg = 64; 
    executor.submit(new Callable<Integer>() { 
     public Integer call() throws Exception { 
      return arg * 2; 
     } 
    }); 
1

आप है ipAddress और उसके एक्सेसर से मुलाकात के रूप में एक संपत्ति इस तरह के defien रहे हैं: Callable गुमनाम वर्ग के उदाहरण के रूप में, आप final क्षेत्र गुमनाम वर्ग के बाहर उदाहरण में डेटा पारित करने के लिए उपयोग कर सकते हैं hod। और constructor में या setter विधि में अपना मान गुजर रहा है। doPing कक्षा में ipAddress संपत्ति का उपयोग करें।

class DoPing/* In java all classes start with capital letter */implements Callable<String> 
{ 
    private String ipAddress; 

    public String getIpAddress() 
    { 
     return ipAddress; 
    } 

    public void setIpAddress(String ipAddress) 
    { 
     this.ipAddress = ipAddress; 
    } 

    /* 
    * Counstructor 
    */ 
    public DoPing(String ipAddress) 
    { 
     this.ipAddress = ipAddress; 
    } 

    @Override 
    public String call() throws Exception 
    { 
     // your logic 
    } 
} 
2

आप call() तर्क पारित नहीं कर सकते क्योंकि विधि हस्ताक्षर यह अनुमति नहीं है, लेकिन यहाँ कम से कम एक तरीका है कि द्वारा

  1. एक अमूर्त वर्ग है कि लपेटता/औजार को परिभाषित करने के आसपास काम करने के लिए है Callable और
  2. एक सेटर को लागू करने call()

में एक परिणाम "इंजेक्षन" करने के लिए 0

एक अमूर्त वर्ग को परिभाषित करें:

public void iWillFireTheCallback (Callback callback) { 
    // You could also specify the signature like so: 
    // Callback<Type of result> callback 

    // make some information ("the result") 
    // available to the callback function: 
    callback.setResult("Some result"); 

    // fire the callback: 
    callback.call(); 
} 

जगह है जहाँ आप iWillFireTheCallback कॉल करना चाहते हैं में:

import java.util.concurrent.Callable; 

public abstract class Callback<T> implements Callable<Void> { 
    T result; 

    void setResult (T result) { 
     this.result = result; 
    } 

    public abstract Void call(); 
} 

विधि है कि कॉलबैक सक्रिय किया जाना चाहिए परिभाषित करें

कॉलबैक फ़ंक्शन को परिभाषित करें (विधियों के अंदर भी संभव है):

class MyCallback extends Callback { 
    @Override 
    public Void call() { 
     // this is the actual callback function 

     // the result variable is available right away: 
     Log.d("Callback", "The result is: " + result); 

     return null; 
    } 
} 

और फिर iWillFireTheCallback फोन जबकि कॉलबैक में गुजर:

iWillFireTheCallback(new MyCallback()); 
संबंधित मुद्दे