java - 为什么此应用程序中的 Toast 不显示任何内容?
问题描述
我编写了一个连接到 wamp 服务器的应用程序(使用 MySQl 数据库,它在表用户中的一行具有用户名 =“pooriya”和密码 =“123”)此应用程序检查用户名“pooriya”是否存在然后敬酒密码,如果不存在 Toast“没有用户”
当我在模拟器上运行这个应用程序时,它应该 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
不正确。
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"
)的应用程序。
如果你在完成btn
之前点击按钮AsyncTask
,此时的值为res
,""
这就是为什么你总是得到空Toast
的。
解决方案:您可以执行以下步骤
第1步:因为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);
}
}
}
第3步:让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。
推荐阅读
- java - 我应该先将客户端的流读入字符串,然后在从客户端的流中获取输入的同时解析 HTTP 还是解析 HTTP?
- c# - 如果自定义身份验证成功,如何制作在 [Authorize] 之前运行的自定义身份验证过滤器并禁用它?
- javascript - 当 turf.booleanPointInPolygon 返回 true 时打开网页
- reactjs - 在 veracrypt 容器中创建反应应用程序失败
- python - 如何为使用 X11 的 linux 创建一个类似于浮动窗口的系统托盘?
- assembly - 自定义指令集
- python - self 可以被类中的队列对象覆盖吗?
- javascript - 无法读取未定义的属性“列表”
- c# - 保存 blob 或 clob 32KB 或更大时:ORA-01460:请求未实现或不合理的转换
- php - 从 SQL-Text-Data 将断点插入 TCPDF