在 Android 网络服务方面需要帮助

Posted

技术标签:

【中文标题】在 Android 网络服务方面需要帮助【英文标题】:Need help in Android web services 【发布时间】:2017-10-25 13:54:09 【问题描述】:

我正在制作一个需要登录和注册的 android 应用程序,我是编程初学者,我已经完成了一些没有显示任何结果或错误的工作。 `

package com.example.user.appliication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

public class RegisterActivity extends AppCompatActivity 

EditText ETname, ETusername, ETpassword, ETconfpas, ETrollnumber, ETemail;
Button RegisterButton;
StringRequest request;
RequestQueue queue;
String URL = "http://user.000webhostapp.com/folder/script.php";

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);



    ETname = (EditText) findViewById(R.id.etName);
    ETusername = (EditText) findViewById(R.id.etUsername);
    ETpassword = (EditText) findViewById(R.id.etPassword);
    ETconfpas = (EditText) findViewById(R.id.etConPass);
    ETrollnumber = (EditText) findViewById(R.id.etRollnumber);
    ETemail = (EditText) findViewById(R.id.etEmail);

    queue = Volley.newRequestQueue(this);

    RegisterButton = (Button) findViewById(R.id.regButton);
    RegisterButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            if(ETname.getText().toString().matches("")||ETusername.getText().toString().matches("")||ETpassword.getText().toString().matches("")||ETconfpas.getText().toString().matches("")||ETrollnumber.getText().toString().matches("")||ETemail.getText().toString().matches(""))
                Toast.makeText(RegisterActivity.this, "All fields required", Toast.LENGTH_SHORT).show();
            
            else
                request = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() 
                    @Override
                    public void onResponse(String s) 

                        try 
                            JSONObject jsonObject = new JSONObject(s);
                            boolean success = jsonObject.getBoolean("success");
                            if(success)
                                String message = jsonObject.getString("message");
                                Intent i = new Intent(RegisterActivity.this, HomeActivity.class);
                                startActivity(i);
                                Toast.makeText(RegisterActivity.this, message, Toast.LENGTH_SHORT).show();

                            
                            else 
                                String message = jsonObject.getString("message");
                                Toast.makeText(RegisterActivity.this, message, Toast.LENGTH_SHORT).show();
                            
                         catch (JSONException e) 
                            e.printStackTrace();
                        
                    
                , new Response.ErrorListener() 
                    @Override
                    public void onErrorResponse(VolleyError volleyError) 
                        Toast.makeText(RegisterActivity.this, volleyError.toString(), Toast.LENGTH_SHORT).show();
                    
                )
                    @Override
                    protected HashMap<String, String> getParams()
                        HashMap<String,String> params = new HashMap<String, String>();
                        params.put("name",ETname.getText().toString());
                        params.put("username",ETusername.getText().toString());
                        params.put("password",ETpassword.getText().toString());
                        params.put("rollnumber",ETrollnumber.getText().toString());
                        params.put("email",ETemail.getText().toString());
                        return params;
                    
                ;
                queue.add(request);
            
        
    );

    `

用于注册的PHP脚本是

<?php
$response = array();
if (isset($_POST['user_name']) && isset($_POST['user_password']) && 
isset($_POST['user_fullname'])) 
// include db connect
require_once __DIR__ . '/connection.php';

$name = $_POST['name'];
$username = $_POST['username'];
$password = $_POST['password'];
$rollnumber = $_POST['rollnumber'];
$email = $_POST['email'];

$query = "INSERT INTO appusers(name ,username, password, rollnumber, email) 
VALUES ('$name','$username','$password','$rollnumber','$email')";
 // insert into db
$result = mysqli_query($con,$query);

//check if registration completed
if ($result) 
    $response["success"] = true;
    $response["message"] = "Registration completed";

    // echo JSON response
   echo json_encode($response);

else
    $response["success"] = false;
    $response["message"] = "Rollnumber alreaday exist";

    // echo JSON response
    echo json_encode($response);



else
$response["success"] = false;
$response["message"] = "Something went wrong";

// echo JSON response
echo json_encode($response);

?>

当我运行这个应用程序时,ADB 停止但没有显示任何错误响应,也没有向我的数据库发送数据。

【问题讨论】:

强烈建议您查看准备好的语句,因为您目前对 sql 注入开放。 【参考方案1】:

我从未使用过 StringRequest 你试过不使用 AsyncTask 将它放在主线程上吗? 它看起来像这样:

在您的按钮中单击:

//Trust me you need a progress bar
pb = (ProgressBar) this.findViewById(R.id.regProgressBar);
RegisterButton = (Button) findViewById(R.id.regButton);
    RegisterButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           LoginLoader ll = new LoginLoader(pb, RegisterActivity.this);
           String[] args = new String[6];
           args[0] = URL;
           args[1] = ETname.getText().toString();
           args[2] = ETusername.getText().toString();
           args[3] = ETemail.getText().toString();
           args[4] = ETpassword.getText().toString();
           args[5] = ETrollnumber.getText().toString();
           ll.execute(args);
    );

public class LoginLoader extends AsyncTask<String, Void, String> 
    private final ProgressBar _pb;
    private final Activity _act;

    public LoginLoader(ProgressBar pb, Activity act)
    
        _pb = pb;
        _act = act;

    
    @Override
    protected String doInBackground(String... params) 
        try 
            String url = params[0];
            HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
            con.setDoInput(true);
            con.setRequestMethod("POST");

            if(params.length > 1) 
                con.setDoOutput(true);

                OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());          
writer.write("name=" +  URLEncoder.encode(params[1], "UTF-8") + "&");
writer.write("username=" +  URLEncoder.encode(params[2], "UTF-8") + "&");
writer.write("email=" +  URLEncoder.encode(params[3], "UTF-8") + "&");
writer.write("password=" +  URLEncoder.encode(params[4], "UTF-8") + "&");
writer.write("rollnumber=" +  URLEncoder.encode(params[5], "UTF-8") + "&");
                writer.close();
            
            InputStreamReader reader = new InputStreamReader(con.getInputStream());
            char[] buf = new char[1024];
            StringBuilder sb = new StringBuilder();
            int len = 0;
            while((len = reader.read(buf)) >0)
            
                sb.append(buf, 0, len);
            
            reader.close();
            return sb.toString();
        
        catch (Exception ex)
        
            return null;
        
    
    @Override
    protected void onPostExecute(String result) 

         try 
                            JSONObject jsonObject = new JSONObject(result);
                            boolean success = jsonObject.getBoolean("success");
                            if(success)
                                String message = jsonObject.getString("message");
                                Intent i = new Intent(_act, HomeActivity.class);
                                _act.startActivity(i);
                                Toast.makeText(_act, message, Toast.LENGTH_SHORT).show();

                            
                            else 
                                String message = jsonObject.getString("message");
                                Toast.makeText(_act, message, Toast.LENGTH_SHORT).show();
                            
                         catch (JSONException e) 
                            e.printStackTrace();
                        
        _pb.setVisibility(ProgressBar.INVISIBLE);
    

    @Override
    protected void onPreExecute() 
        _pb.setVisibility(ProgressBar.VISIBLE);
    

    @Override
    protected void onProgressUpdate(Void... values) 

【讨论】:

以上是关于在 Android 网络服务方面需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中从服务器加载大量图像

Android HIDL概述(一)

神经网络 OCR - 参数需要帮助 - Coursera Ng 的示例

申请祷告时间需要编程语言和计算方面的帮助

Qt 多部分帖子问题

centos7搭建postfix邮件服务器