如何从Android应用程序将数据发送到服务器数据库

时间:2018-10-12 10:38:33

标签: php android

我正在使用recyclerview来显示播放器列表。我在回收站视图中添加了一个单击侦听器。我想使用PHP将player_name发送到服务器端。如果有人单击其中一项。但是我不知道为什么代码不起作用。每当我执行代码时,它就会跳到上一个活动。

下面是android代码:

@Override
public void onItemClick_TeamAdapter(int position) {
        TeamItems clickedItem = list_items.get(position);

        String url = "http://www.prasaurus.com/trial_db_php/post_data.php";

        player_name = clickedItem.getPlayer_name();
        player_id = clickedItem.getPlayer_id();
        player_DOB = clickedItem.getPlayer_DOB();

        final List<NameValuePair> parameters = new ArrayList<NameValuePair>();
        parameters.add(new BasicNameValuePair("player_name",player_name));
        //parameters.add(new BasicNameValuePair("player_id",player_id));
        //parameters.add(new BasicNameValuePair("player_DOB",player_DOB));

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);

        try {
            httppost.setEntity(new UrlEncodedFormEntity(parameters));
            HttpResponse response = httpclient.execute(httppost);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这是服务器端php文件的代码:

<?php
$servername = "prasaurus.com";
$username = "prasauru_fand";
$password = "MYPASSWORD";
$dbname = "prasauru_trial_db";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$Name=$_POST['player_name'];

$sql = "INSERT INTO trial_data (player_name)
VALUES ('{$Name}')";
if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?> 

Logcat:

Process: com.prasaurus.app.team_selection, PID: 21966
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
        at java.net.InetAddress.getAllByName(InetAddress.java:215)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
        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:370)
        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 com.prasaurus.app.team_selection.Team1SquadSelection.onItemClick_TeamAdapter(Team1SquadSelection.java:191)
        at com.prasaurus.app.team_selection.TeamAdapter$Viewholder$1.onClick(TeamAdapter.java:81)
        at android.view.View.performClick(View.java:5215)
        at android.view.View$PerformClick.run(View.java:21193)
        at android.os.Handler.handleCallback(Handler.java:742)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5571)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

我正在RecyclerView Adapter上使用Onclick侦听器来选择项目。

1 个答案:

答案 0 :(得分:2)

好的,当您尝试在主线程上执行某些操作时,NetworkOnMainThreadException就会出现,而该操作应该在后台线程上进行。  您可以将代码传输到AsyncTask。错误将得到解决。

public class backgroundTask extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... voids) {
    String url = "http://www.prasaurus.com/trial_db_php/post_data.php";

    player_name = clickedItem.getPlayer_name();
    player_id = clickedItem.getPlayer_id();
    player_DOB = clickedItem.getPlayer_DOB();

    final List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    parameters.add(new BasicNameValuePair("player_name",player_name));
    //parameters.add(new BasicNameValuePair("player_id",player_id));
    //parameters.add(new BasicNameValuePair("player_DOB",player_DOB));

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);

    try {
        httppost.setEntity(new UrlEncodedFormEntity(parameters));
        HttpResponse response = httpclient.execute(httppost);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
protected void onPostExecute(String aVoid) {
    super.onPostExecute(aVoid);
}
}

用于调用此方法。使用

new backgroundTask().execute();