Как использовать пользовательский ввод для открытия API JSON - PullRequest
0 голосов
/ 27 октября 2019

Я работаю над приложением Android, в котором я создаю приложение погоды. Приложение открывает данные API из JSON и отображает эту информацию. В частности, он принимает пользовательский ввод города или почтового индекса и добавляет эту информацию в URL для API, а затем выполняет 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");
                    }

... Он будет отображать только данные URL-адреса по умолчанию, открытого в GetJsonData.java. У меня вопрос, что я делаю неправильно и что я должен исправить, чтобы приложение работало с пользовательским вводом так, как должно.

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Это потому, что вы всегда используете один и тот же URL в GetJsonData классе. В соответствии с вопросом Какие аргументы передаются в 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
}
0 голосов
/ 27 октября 2019

вы вызываете GetJsonData.execute с URL-адресом, который содержит данные клиента, но в нем нет кода. Глядя на ваш текущий код, почтовый индекс, который вводит клиент, не сохраняется в рабочем классе.

...