来自Button onclick函数的http get请求。

时间:2013-08-12 10:11:14

标签: android

我正试图在我的onclick函数上运行http get请求,我有edittext需要用户提供的edittext包含要在http get请求中使用的url。 / p>

我的按钮是:

<Button
        android:id="@+id/mybutton"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="button" 
        android:onClick="Functionbtn"/>

在我的活动中我得到了

public void Functionbtn(View view) {
    Toast.makeText(getApplicationContext(), "this is my toast",
            Toast.LENGTH_LONG).show();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {
        // Getting Array of Contacts
        contacts = json.getJSONArray(TAG_CONTACTS);

        // looping through All Contacts
        for (int i = 0; i < contacts.length(); i++) {
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String id = c.getString(TAG_ID);
            String name = c.getString(TAG_NAME);

            Toast.makeText(getApplicationContext(), id + " = " + name,
                    Toast.LENGTH_LONG).show();

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

我得到了一个错误:

08-12 18:01:21.353: E/AndroidRuntime(10940): Caused by: android.os.NetworkOnMainThreadException
08-12 18:01:21.353: E/AndroidRuntime(10940):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
08-12 18:01:21.353: E/AndroidRuntime(10940):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)

有人说我的目标sdk为9,但我不认为这是最好的做法。

任何人都可以帮我不确定该怎么做。提前谢谢。

3 个答案:

答案 0 :(得分:2)

不要在UI线程中执行此类network相关工作。始终在network内进行基于AsyncTask的工作,并从UI线程调用它。

public void Functionbtn(View view) {
   new GetTaskDone().execute();
}

protected class GetTaskDone extends AsyncTask<Void, Void, String> {

     @Override
     protected void onPreExecute() {
          super.onPreExecute();
          Toast.makeText(getApplicationContext(), "this is my toast",
          Toast.LENGTH_LONG).show();
     }

    protected String doInBackground(Void... params) {

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {
        // Getting Array of Contacts
        contacts = json.getJSONArray(TAG_CONTACTS);

        // looping through All Contacts
        for (int i = 0; i < contacts.length(); i++) {
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String id = c.getString(TAG_ID);
            String name = c.getString(TAG_NAME);
            return id + " = " + name;
        }
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }
    }

    @Override
    protected void onPostExecute(String result) {
          super.onPostExecute(result);
          Toast.makeText(getApplicationContext(), result,
                    Toast.LENGTH_LONG).show();
    }

}

答案 1 :(得分:1)

由于android的严格规则,你不能也不应该在UI线程上运行网络任务(或需要时间来完成的类似任务)。

相反,您应该通过使用AsyncTask或简单Java Threads在后台线程中运行任务来实现它。

答案 2 :(得分:1)

总是记得在线程或asynctask类中运行网络调用。 最好是asynctask。