2014-04-03 41 views
0

我们希望在我们的服务器上运行一个php脚本,以便使用HttpClient和HttpPost将数据(在变量nameValuePairs中)插入到我们的数据库中。 如果我们使用Idea IntelliJ创建下面的代码作为Android应用程序,它的工作原理很好。 但是,如果它是在Eclipse中创建的,则应用程序在.execute()方法崩溃并抛出一个正常的异常“null”。HttpClient在Eclipse中执行()崩溃

HttpClient httpclient = new DefaultHttpClient(httpParameters); 
HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php"); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
httpclient.execute(httppost); 

您是否熟悉这个问题,或者为什么在Eclipse中创建的程序会在IntelliJ中崩溃并运行?

编辑:这里的错误日志在Eclipse:

04-04 08:11:33.429: E/AndroidRuntime(2888): FATAL EXCEPTION: main 
04-04 08:11:33.429: E/AndroidRuntime(2888): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobile.inserttest/com.mobile.inserttest.MainActivity}: android.os.NetworkOnMainThreadException 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread.access$600(ActivityThread.java:127) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.os.Looper.loop(Looper.java:137) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread.main(ActivityThread.java:4441) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at dalvik.system.NativeStart.main(Native Method) 
04-04 08:11:33.429: E/AndroidRuntime(2888): Caused by: android.os.NetworkOnMainThreadException 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:580) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:512) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:490) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at com.mobile.inserttest.DBConnection.insert(DBConnection.java:170) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at com.mobile.inserttest.MainActivity.onCreate(MainActivity.java:29) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.Activity.performCreate(Activity.java:4465) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931) 
04-04 08:11:33.429: E/AndroidRuntime(2888):  ... 11 more 

感谢所有帮助!

+0

我猜它没有任何与IDE。发布stacktrace – Raghunandan

+0

是的,提供一些错误细节。 – NiVeR

+0

请发布错误日志。 –

回答

5

你应该在一个单独的线程中创建HTTP请求。 NetworkOnMainThreadException表示您正在尝试在主线程上进行网络操作。

docs at developer.android.com

1]使用简单的线程

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      HttpClient httpclient = new DefaultHttpClient(httpParameters); 
      HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httpclient.execute(httppost); 

     } 
    }); 
    t.start(); 

2]可以使用的AsyncTask,如果你想拥有在任务更多的控制:

AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 
      ttpClient httpclient = new DefaultHttpClient(httpParameters); 
      HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httpclient.execute(httppost); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      // Notifies UI when the task is done 
      textView.setText("Insert finished!"); 
     } 
    }.execute(); 

3]使用一些网络库(robospice,retrofit)使写异步网络任务变得更容易一些。

+1

非常感谢,终于有效!我真的陷入了很大的困境,因为它在IntelliJ没有螺纹环绕的情况下工作。但无论如何,谢谢! – Elektropepi

1

android.os.NetworkOnMainThreadException因为您在main thread上执行网络操作而抛出,这就是为什么它会崩溃。

AsyntaskdoInBackGround方法将你的网络调用的代码,然后尝试

private class LongOperation extends AsyncTask<Void, Void, Void> { 


    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(httpParameters); 
     HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     httpclient.execute(httppost); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    } 

} 
+0

是或者线程或AsyncTask做他们的工作,谢谢! – Elektropepi

+1

在线程中,您不知道网络操作何时完成,但在asyntask中,网络操作完成时会通知您。 –

+0

是的,线程只是一个解决方法来测试它,但是,AsyncTask确实更好。 – Elektropepi