HttpPost变量和PHP错误

问题描述:

.PHP文件通过创建数据库连接并插入sql成功工作。 我唯一的结论,那就是在.java活动 的某个地方..是的,我已经在清单中设置了INTERNET PERMISSIONS。HttpPost变量和PHP错误

MY ERROR:01-03 21:56:05.784:W/System.err的(1398):android.os.NetworkOnMainThreadException

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 
      //setContentView(R.layout.email); 
      try { 
       postInternetData(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

private void postInternetData() { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://www.example.com/app/insert_tag.php"); 

    try{    
     List<NameValuePair> formparams = new ArrayList<NameValuePair>(); 
     formparams.add(new BasicNameValuePair("name", "android")); 

     post.setEntity(new UrlEncodedFormEntity (formparams)); 

     HttpResponse response = httpclient.execute(post); 

     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     } 

    } 

<?php 
// CREATE the connection 
$connection = mysql_connect('XXXXXXXXXXX.db.godaddy.com','XXXXXXXXXXX','XXXXXXXXXXX'); 
if(!$connection) { 
    echo 'failure to connect host'; 
} 

$mysql_select_db = mysql_select_db('XXXXXXXXXXX', $connection); 

if(!$mysql_select_db) { 
    echo 'failure to select db'; 
} 

$name = $_POST['name']; 

$qry = "INSERT INTO httptest(id, name) VALUES ('', '" . $name . "');"; 

$result = mysql_query($qry, $connection); 
IF (!$result){ 
    echo 'failure to query db'; 
} else { 
    echo $result; 
} 
?>  

后通过计算器的实施例和人文件故障排除小时,我折。 有什么突出的东西给你? 谢谢。

+0

什么是“无法互动与发布的变量“是什么意思?我们在这里看什么? PHP脚本在哪里? – deceze 2012-01-04 02:50:34

+0

我会发布php的内容。 – wurde 2012-01-04 02:55:55

+1

@Peceiver请通过编辑您的原始文章,而不是在评论中发布PHP。 – 2012-01-04 02:57:20

从Android 3.0开始,如果您在主(又名GUI)线程上有任何网络操作(例如,连接到您的站点),则应用程序将引发NetworkOnMainThreadException。尝试在运行2.2的模拟器中进行测试,看看它是否正常工作(并且代码中没有其他错误)。否则,要使其在3.x和4.x上工作,您需要查看Android中的threading。可以找到教程here

+0

这个论坛的岩石! – wurde 2012-01-04 05:13:06

可能的是,在UI线程上启用了StrictMode。

尝试:

ThreadPolicy tp = ThreadPolicy.LAX; 
StrictMode.setThreadPolicy(tp); 

以上不推荐的做法,虽然,我认为你需要使用一个AsyncTask

和其他人一样,Android不再允许UI线程上的任何网络活动。即使他们这样做了,也不能这样做,因为在网络活动期间,UI将无响应,从而导致糟糕的用户体验。

你需要使用什么是ASyncTask

这是你将如何调用ASyncTask

new MyAsyncTask().execute(); 

这是你如何设置它

private final class MyAsyncTask extends AsyncTask<Void,Void,Void> 
    { 
     private ProgressDialog progressdialog; 
     protected String doInBackground(Void... params) 
     { 
      try 
      { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(new HttpGet("http://example.com/getinfo")); 
       StatusLine statusLine = response.getStatusLine(); 

       if(statusLine.getStatusCode() == HttpStatus.SC_OK) 
       {    
        //successful response     
       } 
       else 
       { 
        response.getEntity().getContent().close(); 
        throw new IOException(statusLine.getReasonPhrase()); 
       } 
      } 
      catch(Exception e) 
      { 
       ProgressDialog.show(HelloWorldActivity.this,"","Failed",true);    
      }   
     } 

     protected void onPostExecute(String result) 
     { 
      if (progressdialog.isShowing()) 
       progressdialog.dismiss(); 

      Toast.makeText(HelloWorldActivity.this,"Completed",Toast.LENGTH_SHORT).show();  
     }  

     protected void onPreExecute() 
     { 
      progressdialog = ProgressDialog.show(HelloWorldActivity.this,"","Working...",true); 
     }  
    }