【问题标题】:Why Toast in this application does not show anything?为什么此应用程序中的 Toast 不显示任何内容?
【发布时间】:2019-08-08 12:41:13
【问题描述】:

我编写了一个连接到 wamp 服务器的应用程序(使用 MySQl 数据库,它在表用户中的一行具有 Username="pooriya" 和 Password="123") 此应用程序检查用户名“pooriya”是否存在然后吐司密码,如果不存在吐司“无用户”

当我在模拟器上运行这个应用程序时,它应该 Toast "123",但是 显示空 Toast。为什么 ? 即使我将用户更改为不存在的用户名,例如“poori”,也会再次显示空 Toast。为什么 ? 数据库名称是“note_test_2_db” 当我在浏览器中输入地址“http://127.0.0.1:8080/mysite1/index.php”时,它显示“没有用户”,那么我猜 php 文件工作正常,问题出在我的 android 代码中。 谢谢

package com.example.GetDataFromServer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MyActivity extends Activity {

    public static String res = "";
    Button btn;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.button);
        new getdata("http://127.0.0.1:8080/mysite1/index.php", "pooriya").execute();

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), res, Toast.LENGTH_LONG).show();
            }
        });

    }
}




package com.example.GetDataFromServer;

import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

/**
 * Created with IntelliJ IDEA.
 * User: Farid
 * Date: 3/15/19
 * Time: 4:09 PM
 * To change this template use File | Settings | File Templates.
 */
public class getdata extends AsyncTask {
    private String Link = "";
    private String User = "";

    public getdata(String link, String user) {
        Link = link;
        User = user;
    }

    @Override
    protected String doInBackground(Object... objects) {
        try {
            String data = URLEncoder.encode("username", "UTF8") + "=" + URLEncoder.encode(User, "UTF8");

            URL mylink  = new URL(Link);
            URLConnection connect = mylink.openConnection();

            connect.setDoOutput(true);
            OutputStreamWriter wr= new OutputStreamWriter(connect.getOutputStream());
            wr.write(data);
            wr.flush();

            BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream()));
            StringBuilder sb = new StringBuilder();

            String line = null;
                while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            MyActivity.res = sb.toString();

        } catch (Exception e) {
        }

        return "";  //To change body of implemented methods use File | Settings | File Templates.
    }
}




     $con=mysql_connect("localhost","root","");
        mysql_select_db("note_test_2_db",$con);
        $user=$_POST['username'];
        $sqlQ="select * from users where Username='$user'";
        $result= mysql_Query($sqlQ);
        $row=mysql_fetch_array($result);
        if($row[0]){
            print $row[1];
        }
        else{
            print "no user";
        }
        mysql_close($con);

【问题讨论】:

  • 您是否在清单文件中添加了互联网权限?
  • 像这样检查它,如果它不起作用,请告诉我Toast.makeText(MyActivity.this, "Hello this is toast", Toast.LENGTH_LONG).show();
  • http://127.0.0.1:8080 不是您需要使用的 IP 地址。 127.0.0.1 是模拟器本身的地址。你也忽略了异常,这就是为什么你不知道出了什么问题。
  • 永远,永远,永远不要相信用户输入! $user=$_POST['username']; 行可用于执行 SQLInjection!使用mysql_real_escape_string 转义数据或使用PDO
  • 您的 toast 消息为空。如果消息为空,你想向用户显示什么???

标签: java php android mysql


【解决方案1】:

我解决了这个问题。我应该使用

http://10.0.2.2:8080/mysite1/index.php
改为
http://127.0.0.1:8080/mysite1/index.php

【讨论】:

    【解决方案2】:

    问题:您显示Toast 的代码似乎不正确。

    new getdata("http://127.0.0.1:8080/mysite1/index.php", "pooriya").execute();
    
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(getApplicationContext(), res, Toast.LENGTH_LONG).show();
        }
    });
    

    执行第一行时,应用程序将启动连接到您的服务器的AsyncTask 以获取响应("123""No User")。

    如果在AsyncTask完成之前点击按钮btn,此时res的值为"",这就是为什么Toast总是空的原因。

    解决方法:您可以执行以下步骤

    第一步:因为getdata是一个单独的类,所以你需要定义一个接口将数据("123""No User"或任何值)传回MyActivity

    public interface OnDataListener {
        void onData(String result);
    }
    

    第二步:修改getdata

    public class getdata extends AsyncTask<Object, Void, String> {
        private String Link = "";
        private String User = "";
        private WeakReference<OnDataListener> mListener;
    
        public getdata(String link, String user, OnDataListener listener) {
            Link = link;
            User = user;
            mListener = new WeakReference<>(listener);
        }
    
        @Override
        protected String doInBackground(Object... objects) {
            try {
                String data = URLEncoder.encode("username", "UTF8") + "=" + URLEncoder.encode(User, "UTF8");
    
                URL mylink = new URL(Link);
                URLConnection connect = mylink.openConnection();
    
                connect.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(connect.getOutputStream());
                wr.write(data);
                wr.flush();
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream()));
                StringBuilder sb = new StringBuilder();
    
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
    
                // This string will pass as param of onPostExecute method.
                return sb.toString(); // Will return "123" or "No User" if there is no exception occurs.
            } catch (Exception e) {
            }
    
            // If your app reach this line, it means there is an exception occurs, using a unique string for debugging.
            // This string will pass as param of onPostExecute method
            return "An exception has been caught!!!";
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
    
            // Pass the result back to MyActivity's onData method.
            if (mListener != null && mListener.get() != null) {
                mListener.get().onData(result);
            }
        }
    }
    

    第三步:MyActivity实现OnDataListener接口。

    public class MyActivity extends AppCompatActivity implements OnDataListener {
    
        public static String res = "";
        Button btn;
    
        /**
         * Called when the activity is first created.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            btn = (Button) findViewById(R.id.button);
            new getdata("http://127.0.0.1:8080/mysite1/index.php", "pooriya", this).execute();
    
            // TODO: Comment-out this code
    //        btn.setOnClickListener(new View.OnClickListener() {
    //            @Override
    //            public void onClick(View view) {
    //                Toast.makeText(getApplicationContext(), res, Toast.LENGTH_LONG).show();
    //            }
    //        });
        }
    
        @Override
        public void onData(String result) {
            // result is passed from the AsyncTask's onPostExecute method.
            Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
        }
    }
    

    注意:因为您在连接服务器时不使用任何加载指示器,所以您需要等待几秒钟才能看到屏幕上的 Toast。

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2018-11-08
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多