2013-03-17 87 views
-1

我想通过http发布请求发布一些数据,并了解整个过程。我在Android开发者网站上的红色文档,我看过一些YouTube教程,但我仍然有一些我不熟悉的点。我发现下面的登录示例代码,但它没有在AsyncTask中。我知道它必须是。但是,当我尝试做与AsyncTask做我的参数是不好定义,我卡住了。任何人都可以帮我解释一下,如果我想将一些数据传递给http服务器上的.php脚本,它是如何工作的?这里是我的代码:(编辑完成后,这是我尝试的AsyncTask):android asynctask创建

public class AndroidLogin extends Activity implements OnClickListener{ 

Button ok,back,exit; 
TextView result; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_android_login); 

// Login button clicked 
    ok = (Button)findViewById(R.id.btn_login); 
    ok.setOnClickListener(this); 

    result = (TextView)findViewById(R.id.lbl_result); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_android_login, menu); 
    return true; 
} 

private class Login extends AsyncTask <String,String,String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     // Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 

     /* login.php returns true if username and password is equal to saranga */ 
     HttpPost httppost = new HttpPost("http://www.mysite.com/login.php"); 

     try { 
      // Add user name and password 
     EditText uname = (EditText)findViewById(R.id.txt_username); 
     String username = uname.getText().toString(); 

     EditText pword = (EditText)findViewById(R.id.txt_password); 
     String password = pword.getText().toString(); 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("username", username)); 
      nameValuePairs.add(new BasicNameValuePair("password", password)); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      Log.w("SENCIDE", "Execute HTTP Post Request"); 
      HttpResponse response = httpclient.execute(httppost); 

      String str = inputStreamToString(response.getEntity().getContent()).toString(); 
      Log.w("SENCIDE", str); 

      if(str.toString().equalsIgnoreCase("true")) 
      { 
      Log.w("SENCIDE", "TRUE"); 
      result.setText("Login successful"); 
      }else 
      { 
      Log.w("SENCIDE", "FALSE"); 
      result.setText(str);    
      } 

     } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

     StringBuilder inputStreamToString(InputStream is); 
      String line = ""; 
      StringBuilder total = new StringBuilder(); 
      // Wrap a BufferedReader around the InputStream 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      // Read response until the end 
      try { 
      while ((line = rd.readLine()) != null) { 
       total.append(line); 
      } 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
      // Return full string 
      return total; 

     return null; 
    } 


} 

public void onClick(View view) { 

    new Login().execute(); 
} 

}

+0

你想知道第二部分代码正在进行什么或者你想知道关于AsyncTask的工作? – 2013-03-17 20:48:42

+3

请阅读[AsyncTask参考](http://developer.android.com/reference/android/os/AsyncTask.html) – Sajmon 2013-03-17 20:50:02

+0

说实话都是这样。我想知道如何把它放到AsyncTask中,我也想知道第二部分代码是怎么回事。 :) – user2179427 2013-03-17 21:03:23

回答

0

首先方法签名protected String doInBackground(String... params)意味着params需要是String阵列。

其次,永远不要做像在AsyncTaskdoInBackground(...)方法如下什么...

EditText uname = (EditText)findViewById(R.id.txt_username); 
String username = uname.getText().toString(); 

EditText pword = (EditText)findViewById(R.id.txt_password); 
String password = pword.getText().toString(); 

...的原因是doInBackground(...)方法在一个单独的线程的主要运行(UI)线程并尝试访问UI元素(如EditText小部件)将导致异常。相反,将这些代码行移动到ActivityonClick(...)方法。然后,您可以凭据传递给使用以下(比如)doInBackground(...)方法...

new Login().execute(new String[] {username, password}); 

...然后在doInBackground(String... params)方法,params[0]将用户名和params[1]将是密码。