【问题标题】:how can I run to background process at once我怎样才能一次运行到后台进程
【发布时间】:2017-07-29 13:07:07
【问题描述】:

我正在开发一个执行端口扫描的应用程序。我的问题是我试图在扫描发生时实现一个进度条。现在我使用 AsynTask 来执行扫描。但是如何在扫描执行时更新进度条?我可以为这两个任务使用相同的 AsynTask 还是我需要实现一个单独的任务。任何帮助表示赞赏! 端口扫描活动

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!");
        }
    }
}

【问题讨论】:

    标签: android android-asynctask android-progressbar


    【解决方案1】:

    在进度更新时传递您的自定义类对象,其中包含字符串和进度整数。

    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!");
        }
    }
    

    【讨论】:

    • 但进度发生在 doInBackground 中。例如,假设我正在扫描 1000 个端口。增量发生在 doInBackground 中。每次扫描新端口时,我也会增加进度。如何将其传递给 progressUpdate values[0] 仅包含来自端口扫描的字符串...除非,我错过了如何正确执行此操作的概念。希望你能理解我的担忧..谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2021-05-27
    相关资源
    最近更新 更多