2017-03-08 10 views
0

でバックグラウンド・プロセスを実行することができます。私の問題は、私はスキャンが行われるようプログレスバーを実装しようとしているということです。今私はスキャンを実行するためにAsynTaskを使用します。しかし、スキャンの実行中にプログレスバーを更新するにはどうすればよいですか?私は両方のタスクに対して同じAsynTaskを使用するか、私は別のものを実装する必要がありますすることができます。どんな助けにも感謝します!進捗Updateで PortScanActivityは、どのように私は「他のものの間でポートスキャンをプリフォームのアプリに取り組んで一度

package com.example.android.droidscanner; 

import android.content.Intent; 
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.Adapter; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.net.ConnectException; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.net.SocketAddress; 
import java.net.SocketTimeoutException; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 

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

public class PortScanActivity extends AppCompatActivity{ 

    String ipAddress; 
    ArrayList<String> openPorts; 
    ArrayAdapter<String> portAdapter; 
    int startPort = 0; 
    int endPort = 1023; 
    TextView statusMsg; 

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

     Intent portIntent = getIntent(); 
     ipAddress = portIntent.getStringExtra("host"); 

     statusMsg = (TextView) findViewById(R.id.status_msg); 

     //setting the adapter 
     ListView portList = (ListView) findViewById(R.id.scan_list); 
     openPorts = new ArrayList<>(); 
     portAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, openPorts); 
     portList.setAdapter(portAdapter); 

     //scanning ports 
     PortScanTask portScan = new PortScanActivity.PortScanTask(); 
     portScan.execute(); 

    } 

    private class PortScanTask extends AsyncTask<Void, String, Void> { 

     int timeOut = 1000; //for how long try connection in ms 

     @Override 
     protected void onPreExecute() { 
      openPorts.clear(); 
      statusMsg.setText("Scanning " + ipAddress + " ports.."); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      for (int i = startPort; i <= endPort; i++) { 
       try { 
        //establishing connection to every port 
        Socket socket = new Socket(); 
        SocketAddress address = new InetSocketAddress(ipAddress, i); 
        socket.connect(address, timeOut); 
        Log.v("Connecting to: ", ipAddress + i); 
        if (socket.isConnected()) { 
         socket.close(); 
         publishProgress(ipAddress + ": " + i); 
        } 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (SocketTimeoutException e) { 
        e.printStackTrace(); 
       } catch (ConnectException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(String... values) { 
      openPorts.add(values[0]); 
      portAdapter.notifyDataSetInvalidated(); 
      Toast.makeText(getApplicationContext(), values[0].toString() + " open!", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      statusMsg.setText("Scan Complete!"); 
     } 
    } 
} 

答えて

0

の両方が含まれているカスタムクラスのオブジェクト、文字列と進捗整数を渡します。

class ProgressStep { 
    int progress; 
    String address; 
} 

private class PortScanTask extends AsyncTask<Void, ProgressStep, Void> { 

    int timeOut = 1000; //for how long try connection in ms 

    @Override 
    protected void onPreExecute() { 
     openPorts.clear(); 
     statusMsg.setText("Scanning " + ipAddress + " ports.."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     for (int i = startPort; i <= endPort; i++) { 
      try { 
       //establishing connection to every port 
       Socket socket = new Socket(); 
       SocketAddress address = new InetSocketAddress(ipAddress, i); 
       socket.connect(address, timeOut); 
       Log.v("Connecting to: ", ipAddress + i); 
       int progress = count_your_progress; 
       ProgressStep step = new ProgressStep(); 
       step.progress = progress; 
       if (socket.isConnected()) { 
        socket.close(); 
        String address = ipAddress + ": " + i; 
        step.address = address; 
       } 
       publishProgress(step); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (SocketTimeoutException e) { 
       e.printStackTrace(); 
      } catch (ConnectException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(ProgressStep... values) { 
     ProgressStep step = values[0]; 
     if (step.address != null) { 
      openPorts.add(step.address); 
      portAdapter.notifyDataSetInvalidated(); 
      Toast.makeText(getApplicationContext(), step.address + " open!", Toast.LENGTH_SHORT).show(); 
     } 

     progressBar.setProgress(step.progress); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     statusMsg.setText("Scan Complete!"); 
    } 
} 
+0

が、進展はdoInBackgroundで行われます。たとえば、1000個のポートをスキャンしているとしましょう。インクリメントはdoInBackgroundで行われます。新しいポートがスキャンされるたびに、私は進捗をインクリメントします。どのように私はprogressUpdate値に[0]のみをスキャンポートから...、私はそれを正しく行う方法についての概念が欠落していない限り、文字列が含まれていることを渡すことができます。私は私のポストを編集したおかげで – miatech

+0

..あなたが私の懸念を理解してほしいです。それをチェックして、役に立つかもしれません。 –

関連する問題