2012-04-03 33 views
30

Tôi đã tạo một đoạn mã lấy địa chỉ IP (từ phương thức chính trong một lớp khác) và sau đó lặp qua một loạt các địa chỉ IP ping từng địa chỉ khi nó đi. Tôi có một giao diện người dùng GUI về điều này và nó đã bị lỗi (vì vậy tại sao tôi đã thực hiện đa luồng. Vấn đề của tôi là tôi không còn có thể lấy địa chỉ IP như một đối số trong mã ping của tôi như là nó có thể gọi được. cho điều này và không thể dường như tìm một cách để có được vòng này.Có cách nào cho một phương pháp gọi để có đối số? Nếu không có cách nào khác để thực hiện những gì tôi đang cố gắng làm gì?Có cách nào để đưa ra một đối số trong một phương thức có thể gọi được không?

mẫu của tôi mã số:.

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 từng là lập luận cho rằng đã được đưa

Trả lời

37

Bạn không thể vượt qua nó làm đối số cho call() vì chữ ký phương thức không cho phép nó.

Tuy nhiên, bạn có thể chuyển nó làm đối số hàm tạo; ví dụ.

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

(Tôi đã sửa chữa một vài lý vi phạm mã phong cách nghiêm trọng !!)

Ngoài ra, bạn có thể:

  • khai báo doping như một lớp bên trong và có nó đề cập đến một final ipToPing trong phạm vi kèm theo hoặc

  • thêm phương thức setIpToPing(String ipToPing).

(cuối cùng cho phép một đối tượng DoPing được tái sử dụng, nhưng nhược điểm là bạn sẽ cần phải đồng bộ hóa để truy cập nó thread-an toàn.)

+0

vậy .... điều này sẽ không hoạt động nếu bạn vượt qua Callable như một tham số để một chức năng mà cố gắng để lặp các Callable đối với một loạt các đối số đã được thông qua ... – Michael

+0

Đây có phải là tuyên bố hoặc câu hỏi không? Dù bằng cách nào, tôi không thể tìm ra những gì bạn đang nói/hỏi. –

5

Khi bạn tạo doping-class (nên thư gọn Visitor Map trong tên lớp), gửi trong ngày e địa chỉ ip trong hàm tạo. Sử dụng địa chỉ ip này trong phương thức gọi.

4

Đặt một số (final) lĩnh vực trong lớp doPing của bạn, và một constructor mà khởi cho họ, sau đó vượt qua các giá trị bạn muốn sử dụng trong call() đến constructor của doPing:

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

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

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

Thêm vào câu trả lời Jarle của - trong trường hợp bạn tạo Callable như thể hiện của lớp vô danh, bạn có thể sử dụng final lĩnh vực bên ngoài của lớp ẩn danh cho truyền dữ liệu vào dụ:

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

bạn phải defien một tài sản như ipAddress và accessor nó gặp hod. và chuyển giá trị của nó theo phương thức constructor hoặc theo phương thức setter. Trong doPing sử dụng lớp học ipAddress tài sản.

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

Bạn không thể vượt qua đối số call() vì chữ ký phương pháp không cho phép nó nhưng ở đây ít nhất là một cách để làm việc xung quanh rằng bằng cách

  1. xác định một lớp trừu tượng mà kết thúc tốt đẹp/dụng cụ Callable
  2. thực hiện một setter để "tiêm" kết quả là vào call()

Xác định một lớp trừu tượng:

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

Xác định phương pháp mà nên bắn gọi lại:

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

Trong nơi bạn muốn gọi iWillFireTheCallback:

Xác định chức năng gọi lại (thậm chí cả các phương thức bên trong có thể):

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

Và sau đó gọi iWillFireTheCallback trong khi đi trong callback:

iWillFireTheCallback(new MyCallback());