0

我想要这样的东西。当用户输入用户名和密码然后单击登录按钮时,我有一个按钮和 2 个文本框,然后将执行登录操作,然后欢迎用户并转到另一个页面。我的代码是这样的:

try {
                Connection.Response res = Jsoup.connect("URL")
                        .data("log", "abcd", "pwd", "12345", "wp-submit", "প্রবেশ", "redirect_to", "url", "testcookie", "1")
                        .method(Method.POST)
                        .execute();
                Map<String, String> cookies = res.cookies();

                Document doc2 = Jsoup
                    .connect("new_url")
                    .cookies(cookies)
                    .get();

                s = doc2.text().toString();
                t.setText(s);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                t.setText("no");
            }

但是登录操作不能成功,这里总是显示“否”。我怎样才能成功地做到这一点???

4

1 回答 1

0

我认为这是线程问题。因为您的互联网请求在主 UI 线程上。测试这个:

private class AsyncExecution extends AsyncTask<Void, Void, Void>{
    boolean tracker = false;
    String s = "";
    @Override
    protected Void doInBackground(Void... params) {
       try {
           Connection.Response res = Jsoup.connect("http://www.kuetlive.com/wp-login.php")
                        .data("log", "abcd", "pwd", "12345", "wp-submit", "প্রবেশ", "redirect_to", "http://www.kuetlive.com/wp-admin/", "testcookie", "1")
                        .method(Method.POST)
                        .settimeout(60000)//time set for the connection 1 min
                        .execute();
                Map<String, String> cookies = res.cookies();

                Document doc2 = Jsoup
                    .connect("http://www.kuetlive.com/wp-admin/profile.php")
                    .cookies(cookies)
                    .get();

                s = doc2.text().toString();
                tracker = true;

       } catch (Exception e) {
           // TODO Auto-generated catch block
           Log.e("tag", e.toString());
           tracker = false;

       }
     }
  --- // }  // --- i add this by mistake, delete this

    @Override
    protected void onPostExecute(Void result) {
       if(tracker){
            t.setText(s);
       }else{
            t.setText("no");
       }
    }

}

并将其称为

new AsyncExecution().execute();

已编辑: 您无法在主 UI 线程上执行 Internet 请求。这就是为什么你需要一个不同的线程。现在你可以实现一个简单的线程而不是AsyncTask. 那为什么我建议你使用AyncTask. 答案是,你不能从一个简单的线程更新你的 UI。这就是您需要的原因AsyncTask,因为AsyncTask您可以灵活地更新 UI,但可以在 UI-Thread 旁边的不同线程中执行您的方法。

于 2013-02-20T09:16:01.633 回答