android.os.NetworkOnMainThreadException。 需要使用asynchronous任务?

我有我的androidloginfunction的问题,得到android.os.NetworkOnMainThreadException

我现在只是删除密码字段来testing是否只是用户名被张贴,我知道这是一个Android 3.2 +的问题。

这是我的代码:

 package com.example.toknapp; import java.util.ArrayList; public class login2 extends Activity { EditText un; TextView error; Button ok; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); un=(EditText)findViewById(R.id.et_un); ok=(Button)findViewById(R.id.btn_login); error=(TextView)findViewById(R.id.tv_error); ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); postParameters.add(new BasicNameValuePair("username", un.getText().toString())); //String valid = "1"; String response = null; try { response = CustomHttpClient.executeHttpPost("http://tokn.me/android_merchant_login.php", postParameters); String res=response.toString(); // res = res.trim(); res= res.replaceAll("\\s+",""); //error.setText(res); if(res.equals("1")) error.setText("Correct Username or Password"); else error.setText("Sorry!! Incorrect Username or Password"); } catch (Exception e) { un.setText(e.toString()); } } }); } } package com.example.toknapp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.util.ArrayList; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; public class CustomHttpClient { /** The time it takes for our client to timeout */ public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds /** Single instance of our HttpClient */ private static HttpClient mHttpClient; /** * Get our single instance of our HttpClient object. * * @return an HttpClient object with connection parameters set */ private static HttpClient getHttpClient() { if (mHttpClient == null) { mHttpClient = new DefaultHttpClient(); final HttpParams params = mHttpClient.getParams(); HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT); HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT); ConnManagerParams.setTimeout(params, HTTP_TIMEOUT); } return mHttpClient; } /** * Performs an HTTP Post request to the specified url with the * specified parameters. * * @param url The web address to post the request to * @param postParameters The parameters to send via the request * @return The result of the request * @throws Exception */ public static String executeHttpPost(String url, ArrayList<NameValuePair> postParameters) throws Exception { BufferedReader in = null; try { HttpClient client = getHttpClient(); HttpPost request = new HttpPost(url); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); request.setEntity(formEntity); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); return result; } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Performs an HTTP GET request to the specified url. * * @param url The web address to post the request to * @return The result of the request * @throws Exception */ public static String executeHttpGet(String url) throws Exception { BufferedReader in = null; try { HttpClient client = getHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI(url)); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String result = sb.toString(); return result; } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 

Solutions Collecting From Web of "android.os.NetworkOnMainThreadException。 需要使用asynchronous任务?"

我想你正在尝试在你的主线上进行一些networking操作

NetworkOnMainThreadException来自文档

应用程序尝试在其主线程上执行联网操作时引发的exception。

更新:

它更好地使用AsyncTask

 private class MyAsyncTask extends AsyncTask<Void, Void, Void> { ProgressDialog mProgressDialog; @Override protected void onPostExecute(Void result) { mProgressDialog.dismiss(); } @Override protected void onPreExecute() { mProgressDialog = ProgressDialog.show(ActivityName.this, "Loading...", "Data is Loading..."); } @Override protected Void doInBackground(Void... params) { // your network operation return null; } } 

只需将清单文件中的目标版本更改为比Honeycomb更爱的版本。

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 

编辑:但使用AsyncTask是解决这个问题更方便的方法。

请检查这个链接 。 它描述了你需要做的一切。

[编辑]

似乎他们改变了页面。 这个链接会告诉你如何使用asynchronous任务