2017-03-04 9 views
0

私はネットワークスキャナを実装しています。 ipアドレスにpingします。 pingが返された場合は、Nodeクラスを使用してNodeを作成します。しかし、doinbackground()でpublishupdateメソッドを使用しようとするとエラーが発生します。また、onprogressupdate()メソッドは、スーパークラスをオーバーライドしないことを示します。実装に何が問題なのですか。私はドキュメントを読んでいますが、それを理解することはできません。どんな助けもありがたい。おかげエラーによってAsynctaskクラスのpublishupdateメソッドを修正する方法

package com.example.android.droidscanner; 

import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by jlvaz on 3/1/2017. 
*/ 

public class IpScanActivity extends AppCompatActivity { 

    String ip; 
    String mac; 
    ArrayList<Node> hostList; 
    ListView networkScan; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.scan_list); 

     hostList = new ArrayList<>(); 

     //inflating adapter 
     networkScan = (ListView) findViewById(R.id.scan_list); 
     NodeAdapter networkAdapter = new NodeAdapter(this, R.layout.list_item, hostList); 
     networkScan.setAdapter(networkAdapter); 

     //scanning network 
     TaskScanNetwork scanNetwork = new TaskScanNetwork(); 
     scanNetwork.execute(); 



    } 

    /* 
     * AscynTask to scan the network 
     * you should try different timeout for your network/devices 
     * it will try to detect localhost ip addres and subnet. then 
     * it will use subnet to scan network 
     * 
     */ 
    private class TaskScanNetwork extends AsyncTask<Void, String, Void> { 

     String localIp; 
     String mac; 
     String subnet; 
     static final int lower = 1; 
     static final int upper = 254; 
     static final int timeout = 1000; 

     @Override 
     protected void onPreExecute() { 
      WifiManager wifiMan = (WifiManager) getSystemService(WIFI_SERVICE); 
      WifiInfo wifiInfo = wifiMan.getConnectionInfo(); 
      int ipAddress = wifiInfo.getIpAddress(); 
      localIp = String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff)); 
      subnet = ip.substring(0, ip.lastIndexOf(".")); 
      hostList.clear(); 
      //textResult.setText("Scanning Network..."); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      for (int i = lower; i <= upper; i++) { 
       String host = subnet + "." + i; 
       Log.v("Host: ", host); 

       try { 
        InetAddress inetAddress = InetAddress.getByName(host); 
        if (inetAddress.isReachable(timeout)) { 
         Node newNode = new Node(host); 
         publishProgress(newNode); 
        } 

       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Node... values) { 
      hostList.add(values[0]); 
      networkScan.deferNotifyDataSetChanged(); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      //result.setText("Live Hosts: "); 
     } 
    } 

} 

ノードクラス

package com.example.android.droidscanner; 

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 

/** 
* Created by george on 2/14/17. 
*/ 

public class Node { 
    String ip; 
    String mac; 
    String CanonicalHostName; 
    String HostName; 
    String remark; 
    boolean isReachable; 

    Node(String ip){ 
     this.ip = ip; 
     //this.mac = mac; 
     this.isReachable = true; 
    } 

    public String getIp() { 
     return ip; 
    } 

    public String getHostName() { 
     return HostName; 
    } 

    public String getMac() { 
     return mac; 
    } 

    public String getRemark() { 
     return remark; 
    } 

    public boolean isReachable() { 
     return isReachable; 
    } 

    @Override 
    public String toString() { 
     return "IP: " + ip + "\n" + 
       "MAC: " + mac + "\n" + 
       "CanonicalHostName:\t" + CanonicalHostName + "\n" + 
       "HostName:\t" + HostName + "\n" + 
       "isReachable: " + isReachable + 
       "\n" + remark; 
    } 

    private void queryHost(){ 
     try { 
      InetAddress inetAddress = InetAddress.getByName(ip); 
      CanonicalHostName = inetAddress.getCanonicalHostName(); 
      HostName = inetAddress.getHostName(); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      remark = e.getMessage(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      remark = e.getMessage(); 
     } 
    } 
} 

NodeAdapterクラス

public class NodeAdapter extends ArrayAdapter<Node>{ 

    public NodeAdapter(Context context, int num, ArrayList<Node> allHost) { 
     super(context, 0, allHost); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     Node host = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 
     } 
     // Lookup view for data population 
     TextView nodeIpTxtView = (TextView) convertView.findViewById(R.id.node_ip); 
     TextView nodeMacTxtView = (TextView) convertView.findViewById(R.id.node_mac); 
     // Populate the data into the template view using the data object 
     nodeIpTxtView.setText(host.getIp()); 
     nodeMacTxtView.setText(host.getMac()); 
     // Return the completed view to render on screen 
     return convertView; 
    } 
} 

答えて

0

は、私はあなたがコンパイルエラーを意味推測します。 AsyncTaskは、いくつかの一般的なパラメータを定義するジェネリック型です。次のように定義を考える:

AsyncTask<BACKGROUND, PROGRESS, POST_EXECUTE> 

あなたが現在持っている:

AsyncTask<Void, String, Void> 

は、だからあなたが言っている:背景に

  • が進行パス上で私の方法Void
  • を渡します私の方法String
  • 投稿実行pass my me THOD Void

しかし、あなたのonProgressUpdate方法はNode種類を期待しています。ここにもあります

private class TaskScanNetwork extends AsyncTask<Void, Node, Void> { 

良い例と解説:だからTaskScanNetworkへのあなたの定義を変更してください。謝罪あなたはすでにこれを見ている場合:!

https://developer.android.com/reference/android/os/AsyncTask.html#AsyncTask()

+0

おかげでバディ... – miatech

+0

NP - この答えはあなたのために働く場合は受け入れることを忘れないでください:) – brindy

関連する問題