Получение RuntimeException при запуске системного пинга в AsyncTask - PullRequest
0 голосов
/ 15 октября 2019

У меня есть утилита Android, которая использует системную команду ping для проверки связи с хостом в сети. Как и ожидалось, я отправляю это в фоновый режим с помощью AsyncTask;Однако я получаю сообщение об ошибке RuntimeException. doinbackground () запускает команду ping и затем публикует процесс ping в onprogressupdate (), который выводит в textView с помощью append. какой правильный способ сделать это. Самое странное, что я буду использовать эту Asynctask в будущем с другими классами. в любом случае любая помощь оценила ошибку

java.lang.RuntimeException: An error occurred while executing doInBackground()

класс MainActivity

package org.techgeorge.pinger2;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

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

public class MainActivity extends AppCompatActivity {
    private Button pingBtn;
    private Spinner spinner;
    private EditText hostTxt;
    private TextView outputTxt;
    private InetAddress ia;
    private AsyncTask pingTask;
    private static final int TIME_OUT = 3000;

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

        hostTxt = (EditText) findViewById(R.id.editText);
        outputTxt = (TextView) findViewById(R.id.ping_output);
        Spinner spinner = findViewById(R.id.spinner);

        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.ping_options, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int postion, long arg3) {
                //TODO Auto-generated method stub
                String  spinnerValue= parent.getItemAtPosition(postion).toString();
                Toast.makeText(getBaseContext(),"Selected item" + spinnerValue,Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) { }
        });

        pingBtn = findViewById(R.id.ping_btn);
        pingBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "Hello world", Toast.LENGTH_SHORT).show();
                pingTask = new PingHostTask();
                pingTask.execute();
            }
        });
    }

    /*
     * {@TaskPingHost} class will ping host by ip or hostname
     */
    private class PingHostTask extends AsyncTask<Void, String, Void> {

        String pingCmd = "/system/bin/ping -c 10 ";
        String host = hostTxt.getText().toString();;
//        String output[];

        @Override
        protected void onPreExecute() {
            host = hostTxt.getText().toString();
            //putting ping command together
            pingCmd = pingCmd + host;
        }

        @Override
        protected Void doInBackground(Void... params) {
            //calling ping command from android bash
            try {
                Process p = Runtime.getRuntime().exec(pingCmd);
                BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    publishProgress(inputLine);
                }
                in.close();
            }
            catch (IOException e) { e.printStackTrace(); }
            catch (RuntimeException e) { e.printStackTrace();}
            return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            //only add to ArrayList<Node> if host is alive on network
            if(values[0] != null && values[0].length() > 0) {
                outputTxt.append(values[0]);
            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...