2

progressdialogこんにちは私はコマンドが実行されるまで表示したいですtelnet。だから私asynctaskはその目的のために使用します。

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

    @Override
    protected String doInBackground(String... arg0) 
    {
        // TODO Auto-generated method stub


        return null;
    }

    @Override
    protected void onPostExecute(String result) 
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        try
          {

              telnet.connect("XXX.XXX.XXX.XXX", 23);

                // Get input and output stream references
                in = telnet.getInputStream();
                out = new PrintStream(telnet.getOutputStream());

                // Log the user on
                readUntil("login:");
                write("jk");
                readUntil("password:");
                write("kk");

                // Advance to a prompt
                readUntil(prompt + "");
                write("ping -t localhost\n");
                readUntil(">");
                write("cdkk");


                AlertDialog.Builder alertbox = new AlertDialog.Builder(TelSampActivity.this);
                String msg="work finished!";
                alertbox.setMessage(msg);
                alertbox.show();

        } 
          catch (Exception e) 
          {
            // TODO: handle exception
        }
        finally
        {
            pd.dismiss();
        }





//          pd.dismiss();
    }

    @Override
    protected void onPreExecute() 
    {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd = new ProgressDialog(TelSampActivity.this);
        pd.setMessage("loading...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.show();
    }

}

そして、私は以下のように電話asynctaskしますoncreate()

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

    try{   

         new AsyncAction().execute();

        }catch (Exception e) {
            e.printStackTrace();
        }

}

progressdialog問題は、コマンドが実行されるまで表示されなかったことです。問題を解決するのを手伝ってください。前もって感謝します。

編集

コマンドを送信および読み取るためのコード

public String readUntil(String pattern) {
    try {
    char lastChar = pattern.charAt(pattern.length()-1);
    StringBuffer sb = new StringBuffer();
    boolean found = false;
    char ch = (char) in.read();
    while (true) {
    System.out.print(ch);
    sb.append(ch);
if (ch == lastChar) 
{
if (sb.toString().endsWith(pattern)) 
{
    if (sb.toString().contains("cdkk"))
    {
        disconnect();
        break;


    }
    else
    {
        return sb.toString();
    }

}
else
{
    disconnect();
    break;
}
}
else if(sb.toString().contains("Failed"))
{
    AlertDialog.Builder alertbox = new AlertDialog.Builder(TelSampActivity.this);
        String error="Invalid username or password!";
        alertbox.setMessage(error);
        alertbox.setTitle("Error");
        alertbox.show();
    System.out.println("bad user name");
    disconnect();
    break;
}

ch = (char) in.read();
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}

public void write(String value) {
try {
out.println(value);
out.flush();
System.out.println(value);
}
catch (Exception e) {
e.printStackTrace();
}
}

public String sendCommand(String command) {
try {
write(command);
return readUntil(prompt + " ");
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}

public void disconnect() {
try {
telnet.disconnect();
}
catch (Exception e) {
e.printStackTrace();
}
}
4

3 に答える 3

1

現在、このメソッドはUIスレッドから呼び出されているため、onPostExecuteからネットワーク操作を実行しようとしています。適切な方法で動作するようにコードを変更する

private class AsyncAction extends AsyncTask<String, Void, String> 
{
     public static boolean status=false;
    @Override
    protected String doInBackground(String... arg0) 
    {
        // TODO Auto-generated method stub
        try
          {

              telnet.connect("XXX.XXX.XXX.XXX", 23);

                // Get input and output stream references
                in = telnet.getInputStream();
                out = new PrintStream(telnet.getOutputStream());

                // Log the user on
                readUntil("login:");
                write("jk");
                readUntil("password:");
                write("kk");

                // Advance to a prompt
                readUntil(prompt + "");
                write("ping -t localhost\n");
                readUntil(">");
                write("cdkk");
               // make status true or false if command successfully executed 
              status=true;

        } 
          catch (Exception e) 
          {
            // TODO: handle exception
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) 
    {

       pd.dismiss();
         // check status if true then show AlertDialog
      if(status==true){
       AlertDialog.Builder alertbox = 
                        new AlertDialog.Builder(TelSampActivity.this);
       String msg="work finished!";
       alertbox.setMessage(msg);
       alertbox.show();
     }
    else{
           // your code here
       }

    }

    @Override
    protected void onPreExecute() 
    {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd = new ProgressDialog(TelSampActivity.this);
        pd.setMessage("loading...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.show();
    }

}
于 2013-01-21T19:36:52.357 に答える
0

onPreExecute()でプログレスバーを表示し、doInBackground()で作業を行ってから、onPostExecute()でプログレスバーを非表示にする必要があります。onPreExecute()とonPostExecute()はどちらもメインスレッドで実行されますが、doInBackgroundはバックグラウンドで実行されます。

于 2013-01-21T19:34:27.743 に答える
0

doInBackground( )内にあるはずのonPostExecute()メソッドで作業を行っており、 onPreExecute() 内に進行状況ダイアログを表示し、onPostExecute()内で閉じます。

于 2020-06-13T12:10:25.873 に答える