通过服务发布数据会导致应用程序崩溃。
通过服务发布数据会导致应用程序崩溃。
我正在尝试通过后台服务向web服务器提交数据。\n函数PostData
将数据发送到服务器,但当我添加它时,程序显示:\n
\n不幸的是,程序停止工作\n
\n这是我的代码:\n
package com.yahya.trackingsysem; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.widget.Toast; public class MyService extends Service { Handler handler=new Handler(); String info; @Override public void onCreate() { hello(); } void hello(){ final Runnable r = new Runnable() { public void run() { Toast.makeText(getApplicationContext(), "Starting service", Toast.LENGTH_LONG).show(); //////////////////// postData(); //////////////////// handler.postDelayed(this, 10000); } }; handler.postDelayed(r, 10000); } //********************* 发送函数 public void postData() { // 创建一个新的HttpClient和Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://www.webserver.net/tracker.php"); try { // 添加数据 ListnameValuePairs = new ArrayList (1); nameValuePairs.add(new BasicNameValuePair("name", "Hi")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // 执行HTTP Post请求 httpclient.execute(httppost); } catch (ClientProtocolException e) { // 处理异常 } catch (IOException e) { // 处理异常 } } //**************************************** @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
\n以及stack trace:\n
10-27 06:11:59.094: E/AndroidRuntime(810): FATAL EXCEPTION: main 10-27 06:11:59.094: E/AndroidRuntime(810): android.os.NetworkOnMainThreadException 10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 10-27 06:11:59.094: E/AndroidRuntime(810): at java.net.InetAddress.getAllByName(InetAddress.java:214) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-27 06:11:59.094: E/AndroidRuntime(810): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-27 06:11:59.094: E/AndroidRuntime(810): at com.yahya.trackingsysem.MyService.postData(MyService.java:60) 10-27 06:11:59.094: E/AndroidRuntime(810): at com.yahya.trackingsysem.MyService$1.run(MyService.java:37) 10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Handler.handleCallback(Handler.java:730) 10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Handler.dispatchMessage(Handler.java:92) 10-27 06:11:59.094: E/AndroidRuntime(810): at android.os.Looper.loop(Looper.java:137) 10-27 06:11:59.094: E/AndroidRuntime(810): at android.app.ActivityThread.main(ActivityThread.java:5103) 10-27 06:11:59.094: E/AndroidRuntime(810): at java.lang.reflect.Method.invokeNative(Native Method) 10-27 06:11:59.094: E/AndroidRuntime(810): at java.lang.reflect.Method.invoke(Method.java:525) 10-27 06:11:59.094: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 10-27 06:11:59.094: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 10-27 06:11:59.094: E/AndroidRuntime(810): at dalvik.system.NativeStart.main(Native Method) 10-27 06:12:09.094: I/Process(810): Sending signal. PID: 810 SIG: 9 10-27 06:12:24.545: D/AndroidRuntime(828): Shutting down VM 10-27 06:12:24.545: W/dalvikvm(828): threadid=1: thread exiting with uncaught exception (group=0x41465700) 10-27 06:12:24.595: E/AndroidRuntime(828): FATAL EXCEPTION: main 10-27 06:12:24.595: E/AndroidRuntime(828): android.os.NetworkOnMainThreadException 10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 10-27 06:12:24.595: E/AndroidRuntime(828): at java.net.InetAddress.getAllByName(InetAddress.java:214) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-27 06:12:24.595: E/AndroidRuntime(828): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-27 06:12:24.595: E/AndroidRuntime(828): at com.yahya.trackingsysem.MyService.postData(MyService.java:60) 10-27 06:12:24.595: E/AndroidRuntime(828): at com.yahya.trackingsysem.MyService$1.run(MyService.java:37) 10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Handler.handleCallback(Handler.java:730) 10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Handler.dispatchMessage(Handler.java:92) 10-27 06:12:24.595: E/AndroidRuntime(828): at android.os.Looper.loop(Looper.java:137) 10-27 06:12:24.595: E/AndroidRuntime(828): at android.app.ActivityThread.main(ActivityThread.java:5103) 10-27 06:12:24.595: E/AndroidRuntime(828): at java.lang.reflect.Method.invokeNative(Native Method) 10-27 06:12:24.595: E/AndroidRuntime(828): at java.lang.reflect.Method.invoke(Method.java:525) 10-27 06:12:24.595: E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 10-27 06:12:24.595: E/AndroidRuntime(828): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 10-27 06:12:24.595: E/AndroidRuntime(828): at dalvik.system.NativeStart.main(Native Method)
问题:通过服务发送数据会导致应用程序崩溃。
出现原因:在线程中不能使用任何与UI相关的内容,而在这里,在一个线程中显示Toast消息,导致应用程序崩溃。解决方法是使用Handler来显示Toast消息。
解决方法示例代码:
Runnable runnable = new Runnable() { public void run() { Message msg = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("myKey", dateString); msg.setData(bundle); handler.sendMessage(msg); } }; private final Handler handler = new Handler() { public void handleMessage(Message msg) { String aResponse = msg.getData().getString("message"); Toast.makeText(getApplicationContext(), "" + msg, Toast.LENGTH_LONG).show(); } };
将此代码添加到你的服务类中。
if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
在Manifest文件中添加以下权限:
我不需要Toast消息,所以我删除了它,但问题仍然存在。嗨...在我的上述帖子中添加了两行代码,请检查一下。我希望它能起作用。
并且,请查看此链接:stackoverflow.com/questions/16439587
现在不再崩溃了,这段小代码修复了问题,虽然我不知道为什么,但感谢你,现在我可以继续查看下一步,看看为什么服务器没有接收到字符串。