I've been getting this error and I can't seem to find the solution.
10-02 06:08:23.928: E/AndroidRuntime(7306): FATAL EXCEPTION: main
10-02 06:08:23.928: E/AndroidRuntime(7306): android.os.NetworkOnMainThreadException
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
10-02 06:08:23.928: E/AndroidRuntime(7306): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
10-02 06:08:23.928: E/AndroidRuntime(7306): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
10-02 06:08:23.928: E/AndroidRuntime(7306): at libcore.io.IoBridge.connect(IoBridge.java:112)
10-02 06:08:23.928: E/AndroidRuntime(7306): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
10-02 06:08:23.928: E/AndroidRuntime(7306): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
10-02 06:08:23.928: E/AndroidRuntime(7306): at java.net.Socket.connect(Socket.java:842)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-02 06:08:23.928: E/AndroidRuntime(7306): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-02 06:08:23.928: E/AndroidRuntime(7306): at com.samplefillform.MainActivity$1.onClick(MainActivity.java:53)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.view.View.performClick(View.java:3511)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.view.View$PerformClick.run(View.java:14105)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.os.Handler.handleCallback(Handler.java:605)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.os.Handler.dispatchMessage(Handler.java:92)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.os.Looper.loop(Looper.java:137)
10-02 06:08:23.928: E/AndroidRuntime(7306): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-02 06:08:23.928: E/AndroidRuntime(7306): at java.lang.reflect.Method.invokeNative(Native Method)
10-02 06:08:23.928: E/AndroidRuntime(7306): at java.lang.reflect.Method.invoke(Method.java:511)
10-02 06:08:23.928: E/AndroidRuntime(7306): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-02 06:08:23.928: E/AndroidRuntime(7306): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-02 06:08:23.928: E/AndroidRuntime(7306): at dalvik.system.NativeStart.main(Native Method)
And I'm not even sure if this code will work if this error will be remove, I've been finding a way to do this for 3 days now and still no luck.
What this app does is the user enters a name and when the button is press the name is send to a remote server form right now that's my localhost using xampp. here my source code:
MainActivity.java
package com.samplefillform;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
Button send;
EditText name;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (EditText) findViewById(R.id.etFName);
send = (Button) findViewById(R.id.bSend);
final String sname = name.getText().toString();
send.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
HttpClient postClient = new DefaultHttpClient();
String postReq = "http://10.0.2.2/formcode.php";
HttpPost request = new HttpPost(postReq);
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("element_8_1", sname));
UrlEncodedFormEntity postEntity = null;
try {
postEntity = new UrlEncodedFormEntity(postParams);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
request.setEntity(postEntity);
@SuppressWarnings("unused")
HttpResponse response = null;
try {
response = postClient.execute(request);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
the activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/etFName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bSend"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/etLName"
android:text="Send"/>
</RelativeLayout>
and the manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.samplefillform"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
and finally the php file that handles the form
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>App Test Form</title>
<link rel="stylesheet" type="text/css" href="./data/form_6/css/view.css" media="all" />
<script type="text/javascript" src="js/view.js"></script>
<script type="text/javascript" src="js/calendar.js"></script>
</head>
<body id="main_body" >
<img id="top" src="images/top.png" alt="" />
<div id="form_container">
<h1><a>App Test Form</a></h1>
<form id="form_6" class="digitalfuture" method="post" action="#main_body">
<div class="form_description">
<h2>App Test Form</h2>
<p></p>
</div>
<ul >
<li id="li_8" >
<label class="description">Name <span id="required_8" class="required">*</span></label>
<span>
<input id="element_8_1" name= "element_8_1" class="element text" maxlength="255" size="8" value="" />
<label>First</label>
</span>
<span>
<input id="element_8_2" name= "element_8_2" class="element text" maxlength="255" size="14" value="" />
<label>Last</label>
</span><p class="guidelines" id="guide_8"><small>Please tell us your name</small></p>
</li> <li id="li_9" >
<label class="description">Phone Number <span id="required_9" class="required">*</span></label>
<span>
<input id="element_9_1" name="element_9_1" class="element text" size="3" maxlength="3" value="" type="text" /> -
<label for="element_9_1">(###)</label>
</span>
<span>
<input id="element_9_2" name="element_9_2" class="element text" size="3" maxlength="3" value="" type="text" /> -
<label for="element_9_2">###</label>
</span>
<span>
<input id="element_9_3" name="element_9_3" class="element text" size="4" maxlength="4" value="" type="text" />
<label for="element_9_3">####</label>
</span>
<p class="guidelines" id="guide_9"><small>Please tell us your phone number</small></p>
</li> <li id="li_10" >
<label class="description">Alternate Phone Number </label>
<span>
<input id="element_10_1" name="element_10_1" class="element text" size="3" maxlength="3" value="" type="text" /> -
<label for="element_10_1">(###)</label>
</span>
<span>
<input id="element_10_2" name="element_10_2" class="element text" size="3" maxlength="3" value="" type="text" /> -
<label for="element_10_2">###</label>
</span>
<span>
<input id="element_10_3" name="element_10_3" class="element text" size="4" maxlength="4" value="" type="text" />
<label for="element_10_3">####</label>
</span>
<p class="guidelines" id="guide_10"><small>Please tell us an alternate phone number to contact you at</small></p>
</li> <li id="li_11" >
<label class="description" for="element_11">Email <span id="required_11" class="required">*</span></label>
<div>
<input id="element_11" name="element_11" class="element text medium" type="text" maxlength="255" value="your@email.com" />
</div>
</li>
</div>
<img id="bottom" src="images/bottom.png" alt="" />
</body>
</html>
Please help me solve this.
You have got android.os.NetworkOnMainThreadException since you are acceising webServices from your Main Ui thread.
To avoid this you have to use Async Tasks or threads,
send.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new Thread(new Runnable()
{
@Override
public void run()
{
HttpClient postClient = new DefaultHttpClient();
String postReq = "http://10.0.2.2/formcode.php";
HttpPost request = new HttpPost(postReq);
List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("element_8_1", sname));
UrlEncodedFormEntity postEntity = null;
try {
postEntity = new UrlEncodedFormEntity(postParams);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
request.setEntity(postEntity);
@SuppressWarnings("unused")
HttpResponse response = null;
try {
response = postClient.execute(request);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
});
Its exactly what is says... In Android 3 and up you cannot make network calls on the main/UI thread. You'll need to open new Thread for it. In your ClickListener put:
new Thread(new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
}
}).start();
Put all the network code inside the run()
function.
It's forbidden to perform a networking operation on application main thread. You should use AsyncTask for this : Painless Threading
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.