Java 为什么此应用程序中的Toast不显示任何内容?
我编写了一个连接到wamp服务器的应用程序(使用一个MySQl数据库,它在表users中的一行有Username=“pooriya”和Password=“123”) 此应用程序检查用户名“pooriya”是否存在,然后删除密码,如果不存在,删除“no user” 当我在emulator上运行这个应用程序时,它应该是“123”,但是 显示空吐司。为什么? 即使我将用户更改为不存在的用户名,如“poori”,也会再次显示空Toast。为什么? 数据库名称为“note\u test\u 2\u db” 当我在浏览器中输入地址“”时,它显示“no user”,那么我猜php文件工作正常,问题出在我的android代码中。 谢谢Java 为什么此应用程序中的Toast不显示任何内容?,java,php,android,mysql,Java,Php,Android,Mysql,我编写了一个连接到wamp服务器的应用程序(使用一个MySQl数据库,它在表users中的一行有Username=“pooriya”和Password=“123”) 此应用程序检查用户名“pooriya”是否存在,然后删除密码,如果不存在,删除“no user” 当我在emulator上运行这个应用程序时,它应该是“123”,但是 显示空吐司。为什么? 即使我将用户更改为不存在的用户名,如“poori”,也会再次显示空Toast。为什么? 数据库名称为“note\u test\u 2\u db”
问题:显示
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();
}
});
当执行第一行时,应用程序将启动异步任务
,该任务连接到服务器以获取响应(“123”
或“无用户”
)
如果在AsyncTask
完成之前单击按钮btn
,此时res
的值为”
,这就是为什么您总是得到空的Toast
解决方案:您可以执行以下步骤
步骤1:因为getdata
是一个单独的类,所以需要定义一个接口将数据(“123”
或“无用户”
或任何值)传递回MyActivity
public interface OnDataListener {
void onData(String result);
}
步骤2:修改getdata
class
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);
}
}
}
注意:因为连接到服务器时不使用任何加载指示器,所以需要等待几秒钟才能在屏幕上看到Toast。我解决了这个问题。我应该改为使用您是否已将internet权限添加到清单文件中?像这样检查它,如果它不起作用,请告诉我
Toast.makeText(MyActivity.this,“您好,这是Toast”,Toast.LENGTH_LONG).show()代码>http://127.0.0.1:8080
不是您需要使用的IP地址。127.0.0.1是仿真器本身的地址。另外,您忽略了异常,这就是为什么您不知道有问题。永远,永远,永远不要相信用户输入!行$user=$\u POST['username']代码>可用于执行SQLInjection!使用mysql\u real\u Escape\u字符串转义数据
或使用PDO
您的toast消息为空。如果消息为空,您希望向用户显示什么???
public interface OnDataListener {
void onData(String result);
}
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);
}
}
}
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();
}
}