httpclient(phpmyadmin)无法在Android 4.0+上运行

我在下面使用此代码,它在Android 2.3.3中完美运行。 但是,在4.0+中它无法以某种方式连接到数据库。 我看到一些关于你需要在asynch类中获取它的post。 我也尝试过,但我似乎无法工作。 我可能错了,但我很难理解。

public class connector extends Activity { /** Called when the activity is first created. */ TextView txt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getServerData(null); } //i use my real ip here public String getServerData(String returnString) { System.out.println("going to connector class"); InputStream is = null; final String KEY_121 = "http://10.0.0.128/connector.php"; String result = ""; //the year data to send // ArrayList nameValuePairs = new ArrayList(); // nameValuePairs.add(new BasicNameValuePair("year","1970")); //http post try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(KEY_121); // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } //convert response to string try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } //parse json data try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); Log.i("log_tag","ID: "+json_data.getInt("ID")+ ", \nActara: "+json_data.getString("Actara") ); //Get an output to the screen returnString += "\n\t" + jArray.getJSONObject(i); } }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return returnString; } } 

Logcat错误(4.0+以上):

 11-12 12:02:35.658: E/log_tag(14083): Error in http connection android.os.NetworkOnMainThreadException 11-12 12:02:35.658: E/log_tag(14083): Error converting result java.lang.NullPointerException 11-12 12:02:35.663: E/log_tag(14083): Error parsing data org.json.JSONException: End of input at character 0 of 

只有第一个错误行很重要,因为它无法连接到数据库,它会产生nullPointer(第2和第3个错误)。

这是我在Asynch尝试过的:

  public class connector extends Activity { /** Called when the activity is first created. */ TextView txt; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new BackgroundAsyncTask().execute(); } public class BackgroundAsyncTask extends AsyncTask { InputStream is = null; final String KEY_121 = "http://10.0.0.128/connector.php"; String result = ""; String returnString = ""; protected void onPostExecute(Void result) { } @Override protected void onPreExecute() { System.out.println("onPreExecute"); } protected Void doInBackground(String... params) { try{ System.out.println("background in progress"); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(KEY_121); // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } //convert response to string try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } //parse json data try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); Log.i("log_tag","ID: "+json_data.getInt("ID")+ ", \nActara: "+json_data.getString("Actara") ); //Get an output to the screen returnString += "\n\t" + jArray.getJSONObject(i); } }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return null; } protected void onProgressUpdate(Integer... values) { } @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub return null; } } } 

有人可以帮助我吗? 我不确定究竟是什么原因导致它不适用于4.0+。
如果您需要更多信息,只需说出来,我就会发布。
代码可能有点乱,我还没有真正“清理”它。

从Android 3.0开始,您不允许在主线程上执行网络操作。 为什么? 因为网络问题会导致ui缓慢。 因此,您必须在新线程中执行所有http内容。 你是在正确的道路上,但你在AsyncTask中犯了一个错误。 删除异步任务中的空doInBackground方法,并在方法上写@Override。

android.os.NetworkOnMainThreadException

这个恐怖来自HoneyComb(3.0或更高版本)。 如文档所述,您无法在其主线程上执行网络操作。 为了获得这个,你必须使用处理程序或asynctask。 AFAIK没有其他方法可以做到这一点。

您可以查看此内容以获取更多详细信息为什么ICS会崩溃您的应用程序

尝试使用以下代码片段

 new Thread(){ public void run(){ //do your Code Here } }.start(); 

好吧……经过几个小时的搜索,提出这个问题,然后10分钟后,你找到了解决方案……

选项1:
我添加了这一行:

  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 

但我建议不要使用选项1,这对于真实来说是一个糟糕的解决方案。 使用选项2!
// ================================================ ===========================
选项2:

使用本教程制作一个合适的ASyncTask:http://www.elvenware.com/charlie/development/android/SimpleHttpGetThread.html

// ================================================ ===========================
使用ASyncTask作为final(选项2)。

为什么在Web连接和Web服务的function中传递null

 getServerData(null);