0

最近我遇到了以下问题:我有一个 webview 以异步方式从 HttpURLConnection 加载数据,现在说您需要用户提供凭据,以便在 http 连接期间继续进行基本身份验证。您不知道 url 是否需要身份验证,您只会从响应中收到 401 错误。是否有适当的方法来暂停异步线程,以便您可以在不停止线程的情况下向用户询问凭据( px.by 一个警报对话框)?

 URL requestedUrl = new URL(url);
        urlConnection = (HttpURLConnection) requestedUrl.openConnection(proxy);
        if (urlConnection instanceof HttpsURLConnection) {
            ((HttpsURLConnection) urlConnection)
                      .setSSLSocketFactory(sslContext.getSocketFactory());
        }
        String userandpass=username+":"+password;

        String basicAuth = "Basic "
                + new String(Base64.encode(
                        userandpass
                                .getBytes(),   Base64.NO_WRAP));
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Authorization", basicAuth);
        result = IOUtil.readFully(urlConnection.getInputStream());
4

1 回答 1

0

它是伪代码。逻辑是:

您可以尝试 n-way,而不是运行单次射击。如果登录成功设置notOk。当 while 测试其执行时,它将结束。否则,asynctask 将在 UI 线程队列上发布一个可运行对象,并且 UI 线程将显示一个对话框。在 Dialog 委托中,设置新的用户名和密码,并通知 asynctask 唤醒 ( notifyAll())。

obj 对于 wait 和 notifyAll 是一样的

while (notOk) {

   // do your network staff

  if (authOk) {
      notOk= false;
      continue;
  } else {

    runOnTheUiThread(
       run () {
            // a dialog with edit text for username and password.
            // and a button "ok". When user press ok:

           {
              myAsynctAskreference.setUserenameAndPassword(username, password);
               synchronized(obj) {
                   obj.notifyAll();
               }
           }
       }
    )

  }

   synchronized(obj) {
        obj.wait();
   }

}
于 2013-05-22T15:35:05.050 回答