asynctask中的任务完成后显示进度对话框

问题描述 投票:2回答:3

嗨,我想显示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();
}
}
android android-asynctask progressdialog telnet
3个回答
1
投票

当前,您正在尝试从onPostExecute执行网络操作,因为此方法是从UI Thread调用的。更改您的代码以正确地工作

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();
    }

}

0
投票

您需要在onPreExecute()中显示进度条,在doInBackground()中完成工作,然后在onPostExecute()中隐藏进度条。 onPreExecute()和onPostExecute()均在主线程上执行,因为doInBackground在后台执行。


0
投票

您正在使用onPostExecute()方法进行工作,该方法应该位于doInBackground()内部在onPreExecute()中显示进度对话框,并在onPostExecute()中关闭。

© www.soinside.com 2019 - 2024. All rights reserved.