2013-02-20 90 views
0

我想要類似that.i的東西有一個按鈕和2個文本框,當用戶把他們的用戶名和密碼,然後單擊登錄按鈕,然後登錄操作將被執行,然後歡迎用戶,並轉到另一個頁面.my代碼是這樣的:在android中使用jsoup post方法

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

但登錄操作不能成功,在這裏它總是顯示「否」。 我怎樣才能成功做到這一點?

+0

在清單文件中添加了適當的權限? – 2013-02-20 08:42:42

+0

我將這個添加到清單文件: DarkenShooter 2013-02-20 08:47:38

+0

調試你的代碼並檢查logcat它說什麼 – 2013-02-20 08:48:26

回答

0

我認爲這是線程問題。因爲你的互聯網請求是在主UI-Thread上。測試:

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線程的網絡請求。這就是爲什麼你需要一個不同的線程。現在你可以實現一個簡單的線程而不是AsyncTask。那麼爲什麼我建議你使用AyncTask。答案是,你不能從簡單的線程更新你的用戶界面。這就是爲什麼你需要AsyncTask,因爲AsyncTask爲你提供了更新UI的靈活性,但在UI-Thread旁邊的不同線程中執行你的方法。

+0

請勿爲此使用普通線程。使用AsyncTask。很有可能你不能設置t的文本。 – RvdK 2013-02-20 09:20:25

+0

我的錯誤,我完全忘記了。我正在編輯我的答案@RvdK – Shoshi 2013-02-20 09:22:54

+0

我有一個新的類名「AsyncExecution」,然後讓我把它叫做新的AsyncExecution()。execute();從我的MainActivity的onCreate ???不是嗎?@ Shoshi – DarkenShooter 2013-02-20 09:45:06