2015-09-04 63 views
2

我正在尝试开发一个从mysql表中删除用户的活动。一旦我登录到应用程序,我希望用户如果想要删除他们的帐户,请点击按钮。当我按一下按钮我得到这些错误:使用PHP和MySQL在Android中删除用户

22416-22416/etsiit.etsiitcast_def E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: etsiit.etsiitcast_def, PID: 22416 
android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 
     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110) 
     at libcore.io.IoBridge.connectErrno(IoBridge.java:137) 
     at libcore.io.IoBridge.connect(IoBridge.java:122) 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456) 
     at java.net.Socket.connect(Socket.java:882) 
     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149) 
     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) 
     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) 
     at etsiit.etsiitcast_def.PerfilFragment$1.onClick(PerfilFragment.java:67) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

这是我删除user.php的功能:

<?php 
require_once 'connectbd.php'; 
// connecting to database 
$this->db = new DB_Connect(); 
$this->db->connect(); 

$query = "DELETE FROM usuarios WHERE username = '$username' LIMIT 1"; 

mysql_query($query); 

if (mysql_affected_rows() == 1) { 
    echo("El usuario ha sido eliminado."); 
} else { 
    echo("Error al eliminar el usuario."); 
} 
?> 

这里是我的Android活动代码:

Button delete = (Button) rootView.findViewById(R.id.delete); 
    delete.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String url = "http://"+IP_Server+"/etsiitcast_db/deleteuser.php"; 
      HttpClient client = new DefaultHttpClient(); 

      try { 
       client.execute(new HttpGet(url)); 
      } catch(IOException e) { 
       //do something here 
      } 
     } 
    }); 

凡IP_SERVER是我的服务器地址。 如果需要更多代码,告诉我。

+0

如果你在网上打开这个php代码,它工作吗?编辑:使用删除限制1没有命令不是一个好方法。结果可能不是唯一的! –

+0

总是读你的logcat。 'android.os.NetworkOnMainThreadException'这是你的问题。 – Bonatti

+0

此外,您可能需要检查HttpClient是否被弃用,并且您应该使用其他连接,例如新的默认HttpURLConnection(但我preffer并建议Volley) – Bonatti

回答

2

在Android中你不能在主线程你需要为移动网络活动网络活动使用AsyncTask或更好的方式使用异步网络库,如VolleyAndroid-Async-Http。我UED异步HTTP之前,我认为这是good.Below我把一些类的例子可能会帮助你

AsyncHttpClient client = new AsyncHttpClient();Button delete = (Button)rootView.findViewById(R.id.delete); 
delete.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     client.get("http://"+IP_Server+"/etsiitcast_db/deleteuser.php", new AsyncHttpResponseHandler() { 

    @Override 
    public void onStart() { 
     // called before request is started 
    } 

    @Override 
    public void onSuccess(int statusCode, Header[] headers, byte[] response) { 
     // feedback to user 
    } 

    @Override 
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { 
     // called when response HTTP status is "4XX" (eg. 401, 403, 404) 
    } 

    @Override 
    public void onRetry(int retryNo) { 
     // called when request is retried 
    } 

}); });

+0

谢谢,这对我很有用。 –

+0

Np男人很高兴它帮助也检查出来Volley它来自gooogle,人们经常使用它 – DreadfulWeather

0

为了不被主线程处理,您需要将您的http调用嵌入到AsyncTask中。

3

在Android中,您不应在主线程上进行网络调用。否则,UI将冻结。为了避免这种情况,Android现在抛出NetworkOnMainThreadException。

所以,你应该在后台进行所有的网络通话。要做到这一点,你可以使用:

  • AsyncTasks
  • 装载机
  • 基本主题...