要求用户提供URL以接收JSON

时间:2017-07-11 10:19:07

标签: java android json

就像练习一样,我正在尝试创建一个从URL中获取JSON的应用程序。

我在stackoverflow中的其他线程中找到了以下代码,它运行正常。我的问题是URL是硬编码的,我需要它作为用户的输入。我应该更改/添加什么?

public class MainActivity extends AppCompatActivity {

    Button btnHit;
    TextView txtJson;
    ProgressDialog pd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnHit = (Button) findViewById(R.id.btnHit);
        txtJson = (TextView) findViewById(R.id.tvJsonItem);

        btnHit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new JsonTask().execute("Url address here");
            }
        });
    }

    private class JsonTask extends AsyncTask<String, String, String> {

    protected void onPreExecute() {
        super.onPreExecute();

        pd = new ProgressDialog(MainActivity.this);
        pd.setMessage("Please wait");
        pd.setCancelable(false);
        pd.show();
    }

    protected String doInBackground(String... params) {

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();
            String line = "";

            while ((line = reader.readLine()) != null) {
                buffer.append(line+"\n");
                Log.d("Response: ", "> " + line);   //here u ll get whole response..... :-) 
            }

            return buffer.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (pd.isShowing()){
            pd.dismiss();
        }
        txtJson.setText(result);
    }
}
}

这是我从以下代码获得该代码的主题:

Get JSON Data from URL Using Android?

2 个答案:

答案 0 :(得分:0)

在异步任务中创建构造函数

private class JSONTask extends AsyncTask<String, String, String> {
String url;
public JSONTask(String url){
this.url=url;
}

使用url字符串代替params [0]

无论你在哪里调用异步任务,都要这样做

new JSONTask(textView.getText()).execute()

这应该解决它。

否则你可以直接使用do in background variable params。

答案 1 :(得分:0)

所以问题是你使用的是TextViewTextView没有收到投入。

EditText确实如此。

进行以下更改:

TextView txtJson;

在你的OnCreate中更改:

txtJson = (EditText) findViewById(R.id.tvJsonItem);
btnHit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new JsonTask().execute(txtJson.getText());
        }
});

现在,在xml文件中,将Button更改为EditText

希望这有帮助。