如何使用用户输入打开api JSON [重复]
Posted
技术标签:
【中文标题】如何使用用户输入打开api JSON [重复]【英文标题】:How to use user input to open api JSON [duplicate] 【发布时间】:2020-02-22 18:30:35 【问题描述】:我正在开发一个 android
应用程序,我正在其中制作一个天气应用程序。应用程序从 JSON
打开 api 数据并显示此信息。更具体地说,它接受用户输入的城市或邮政编码,并将此信息添加到 API 的 URL,然后执行 URL。
MainActivity.java
package com.shanehampcsci3660.weather;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
//import static com.shanehampcsci3660.weather.GetJsonData.*;
public class MainActivity extends AppCompatActivity
public static TextView tempTV, jsonTV;
public EditText cityORZipET;
private Button getWeather;
public String zip, cityOrZip;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tempTV = (TextView) findViewById(R.id.tempTV);
jsonTV = (TextView) findViewById(R.id.jsonFeedTV);
cityORZipET = (EditText) findViewById(R.id.cityORZipET);
getWeather = (Button) findViewById(R.id.getWeatherButton);
//cityOrZip = cityORZipET.getText().toString();
getWeather.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
GetJsonData getJsonData = new GetJsonData();
//getJsonData.execute();
cityOrZip = cityORZipET.getText().toString();
getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=x");
jsonTV.setText(cityOrZip);
/*if(cityOrZip.equals(""))
getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=x");
else
zip = "30528";
getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + zip + "&appid=x");
*/
);
GetJsonData.java
package com.shanehampcsci3660.weather;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class GetJsonData extends AsyncTask<Void, Void, Void>
public String data= "", line = "", name = "";
double temp, minTemp, maxTemp;
@Override
protected Void doInBackground(Void... voids)
try
URL url = new URL("https://api.openweathermap.org/data/2.5/weather?q=30528&appid=id");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while(line != null)
line = bufferedReader.readLine();
data = data + line;
JSONObject jsonObject = new JSONObject(data);
JSONObject main = jsonObject.getJSONObject("main");
name = jsonObject.getString("name");
temp = main.getDouble("temp");
minTemp = main.getDouble("min_temp");
maxTemp = main.getDouble("max_temp");
/*JSONObject jsonObject = new JSONObject(result);
JSONObject jsonData = new JSONObject(jsonObject.getString("main"));
String weatherInfo = jsonObject.getString("weather");
JSONArray jsonArray = new JSONArray(weatherInfo);
String description, icon, iconURI;
for(int i = 0; i < jsonArray.length(); i++)
JSONObject jsonData1 = jsonArray.getJSONObject(i);
description = jsonData1.getString("description");
MainActivityController.description.setText(description);
icon = jsonData1.getString("icon");
iconURI = "http://openweathermap.org/img/w/" + icon + ".png";
Picasso.get().load(iconURI).into(MainActivityController.conditionImageView);
*/
catch(MalformedURLException e)
e.printStackTrace();
catch(IOException e)
e.printStackTrace();
catch (JSONException e)
e.printStackTrace();
return null;
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
//MainActivity.jsonTV.setText(data);
MainActivity.tempTV.setText("City:\t" + name + "\tTemp:\t" + temp);
Log.d("Json Feed", name + "Temp: " + temp);
public static void execute(String s)
我的问题是,无论我放在哪里......
if(cityOrZip.equals(""))
getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + cityOrZip +"&appid=id");
else
zip = "30528";
getJsonData.execute("https://api.openweathermap.org/data/2.5/weather?q=" + zip + "&appid=id");
...它只会显示在GetJsonData.java中打开的默认Url的数据。我的问题是我做错了什么,我应该纠正什么,以使我的应用能够正常使用用户输入。
【问题讨论】:
我建议使用 Volley 而不是 AsyncTask。并且永远不要在 Activity 中使用静态视图 我刚刚开始学习android studio并这样做。我从来没有学过排球 Android 文档中有关于它的指南。还有很多其他方法可以进行 http 调用来避免 AsyncTask 的问题 【参考方案1】:您正在使用包含客户端数据的 url 调用 GetJsonData.execute,但其中没有代码。查看您当前的代码,客户端输入的 zip 不会存储到工作人员类中。
【讨论】:
那么你建议我做什么来解决它 不知道...实现它,也许?【参考方案2】:这是因为您总是在 GetJsonData
类中使用相同的 URL
。根据问题What arguments are passed into AsyncTask?,您的类声明应如下所示:
public class GetJsonData extends AsyncTask<String, Void, YourPojo>
@Override
protected YourPojo doInBackground(String... urls)
try
URL url = new URL(urls[0]);
...
catch (Exception e)
handle(e);
其中YourPojo
是您需要创建的一个类,用于存储您需要从JSON
有效负载中读取的所有属性:
class YourPojo
private String data;
private String line;
private String name;
private double temp;
private double minTemp
private double maxTemp;
// getters, setters
【讨论】:
以上是关于如何使用用户输入打开api JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON 用户 API 中的 POST 将密码值传递给 wordpress