使用 PHP 和 MySQL 删除 Android 中的用户

Delete an user in Android using PHP and MySQL

我正在尝试开发一个 activity 来从 mysql table 中删除一个用户。一旦我登录到该应用程序,我希望用户在想要删除他们的帐户时单击一个按钮。当我单击该按钮时,出现以下错误:

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.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 activity 代码:

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 是我的服务器地址。 告诉我是否需要更多代码。

您需要将 http 调用嵌入到 AsyncTask 中,以免被主线程处理。

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

因此,您应该在后台进行所有网络调用。为此,您可以使用 :

  • 异步任务
  • 装载机
  • 基本线程...

在 android 中,您不能在主线程上进行网络活动,您需要使用 AsyncTask or better way use a asynchronous networking library like Volley or Android-Async-Http 将网络 activity 移动到后台线程。我以前使用过 async-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
    }

}); });