2013-02-20 83 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