У меня есть утилита 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]);
}
}
}
}