2013-01-21 46 views
2

嗨,我想顯示progressdialog,直到通過telnet執行命令。 所以我用asynctask爲此目的。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(); 
    } 

} 

我呼籲在oncreate()asynctask像下面

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

回答

1

當前您正嘗試從onPostExecute執行網絡操作,因爲此方法是從UI線程調用的。改變你的代碼,以適當的方式獲得工作

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

即使未建立連接,它也會顯示對話框。但是如果命令只能完美執行,則需要顯示此對話框。 – krishna

+0

@krishna:如何將已知命令完全執行或不執行? –

+0

我使用system.out.println()打印命令的輸出,我可以讀取應該顯示的命令的確切輸出。 – krishna

0

你需要顯示在onPreExecute進度條()做的工作在doInBackground(),然後隱藏在進度條onPostExecute()。 onPreExecute()和onPostExecute()都在主線程上執行,其中doInBackground在後臺執行。

+0

我需要完成的命令後顯示對話框,或者如果連接失敗,我需要顯示dialogbox.Upto我所知,我們不能使用對話框中doInBackground.so我需要在onpostexecute()中執行它; – krishna

相關問題