Java 我的天气应用程序崩溃了
我正在尝试制作一个天气应用程序。如果你输入一个城市名称,它会给你天气信息,但是如果你输入了一个错误的城市名称,应用程序就会崩溃Java 我的天气应用程序崩溃了,java,android,Java,Android,我正在尝试制作一个天气应用程序。如果你输入一个城市名称,它会给你天气信息,但是如果你输入了一个错误的城市名称,应用程序就会崩溃 protected String doInBackground(String... urls) { String result = ""; URL url; HttpURLConnection urlConnection = null; try { url = n
protected String doInBackground(String... urls) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1){
char current = (char) data;
result += current;
data = reader.read();
}
return result;
} catch (RuntimeException e){
Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG);
} catch(Exception e) {
Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG);
}
return null;
错误
您的toast出现问题,使用UI线程显示toast
Activity_Name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG).show();
}
});
您可以显示城市名称列表以供选择,而不是获取键入的输入,这样就不会输入错误或不正确的输入 或
创建一个城市名称检查,看看它是否是一个有效的城市名称如果不是,不要让它继续下去。甚至可以通过匹配拼写来提供城市名称的建议。您需要在主线程中使用Toast,使用runOnUiThread,或者返回字符串并在活动中使用Toast打印返回值。
boolean flag=false;///在类的顶部声明boolean它是一个类变量
boolean flag=false; // declare boolean at the top of the class it's a class variable
public class Download extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1){
char current = (char) data;
result += current;
data = reader.read();
}
if(result.isEmpty()){
flag=false;
}else{
flag=true;
}
return result;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(!flag){
Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
公共类下载扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
字符串结果=”;
网址;
HttpURLConnection-urlConnection=null;
试一试{
url=新url(url[0]);
urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=urlConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1){
当前字符=(字符)数据;
结果+=电流;
data=reader.read();
}
if(result.isEmpty()){
flag=false;
}否则{
flag=true;
}
返回结果;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
如果(!标志){
Toast.makeText(getApplicationContext(),“找不到天气”,Toast.LENGTH\u LONG.show();
}
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
}
我认为您没有包含足够的崩溃日志。但是根据您的尝试捕获,我认为您无法从doInBackground调用Toast。您还错过了它的.show()
。您也错过了操作中的.show()
。这确实应该在onPostExecute()
中完成。不过应该按照正确的行:)
boolean flag=false; // declare boolean at the top of the class it's a class variable
public class Download extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1){
char current = (char) data;
result += current;
data = reader.read();
}
if(result.isEmpty()){
flag=false;
}else{
flag=true;
}
return result;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(!flag){
Toast.makeText(getApplicationContext(), "Could not find weather", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}