【问题标题】:AsyncTask and Telnet doesn't show ProgressDialogAsyncTask 和 Telnet 不显示 ProgressDialog
【发布时间】:2014-07-25 05:42:04
【问题描述】:

我在做一些远程登录操作时正在使用异步任务。但是,progressdialog 没有显示,我几乎 100% 肯定 Telnet 是原因。

请查看我的代码并帮助我找出问题所在。

谢谢

public class TelnetManager extends AsyncTask<String, Void, String>{

private TelnetClient telnet;
private int port;
private String IP;
private ProgressDialog dialog;
private Context context;

public TelnetManager(Context c,String IP, int port, String user, String pass)
{
    context=c;
    this.IP=IP;
    this.port=port;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    dialog=new ProgressDialog(context);
    dialog.setMessage(context.getResources().getString(R.string.msg_wait));
    dialog.show();
}

public String readString() throws IOException
{
    InputStream in = new BufferedInputStream(telnet.getInputStream());

int read=0;

    String s=null;
     do
        {
           byte[] buffer = new byte[1024];
            read = in.read(buffer);
            if(read > 0)
            {
                if(s==null)s=new String(buffer, 0, read);
                else s+=new String(buffer, 0, read);
                Log.e("S",s);
            }
        }
        while (read > 0);

     in.close();
     return s;
}

public void writeString(String command) throws IOException
{
    OutputStream out = telnet.getOutputStream();
    OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");
    writer.write(command+'\n');
    writer.flush();
}

@Override
protected String doInBackground(String... params) {
    telnet = new TelnetClient();
    String s="";
    try {
        telnet.setConnectTimeout(10000);
        telnet.connect(IP,port);
        telnet.setKeepAlive(true);

        writeString("password");
        writeString(params[0]);
        writeString("exit");
        String aux=readString();
        telnet.getInputStream().close();

    } catch (SocketException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    try {
        telnet.disconnect();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return s;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    if(dialog!=null && dialog.isShowing())
    {
        dialog.dismiss();
    }
}

}

这里是我调用 AsyncTask 的地方:

String list=null;

try {

    list=new TelnetManager(this,"192.168.11.30", 10010, null, null).execute("son").get();
    construirLayout(list,R.id.containerON);
    list=new TelnetManager(this,"192.168.11.30", 10010, null, null).execute("soff").get();
    construirLayout(list,R.id.containerOFF);

} 
catch (InterruptedException e) {
    Toast.makeText(this,"InterruptedException",3000).show();
    e.printStackTrace();
} 
catch (ExecutionException e) {
    Toast.makeText(this,"ExecutionException",3000).show();
    e.printStackTrace();
}

【问题讨论】:

  • 你是如何执行任务的?
  • 试试dialog.setIndeterminate(true);
  • 我已经编辑了问题,所以你将能够看到我在哪里执行任务
  • 如果你要调用get,那么使用异步任务有什么意义?
  • 谢谢njzk2!拿走 get() 后我做了一些更改,现在它似乎工作正常。

标签: android android-asynctask telnet progressdialog


【解决方案1】:

如果您是 call get() on an AsyncTask,您是在告诉 UI 线程阻塞并等待 AsyncTask 结果。由于 UI 线程被阻塞,无法显示 ProgressDialog。

您应该改为提供对 AsyncTask 的回调,以在 onPostExecute() 中触发。

【讨论】:

  • 谢谢,我终于做到了
猜你喜欢
  • 2012-08-13
  • 1970-01-01
  • 2018-05-17
  • 2012-08-13
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多