我正试图在我的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,但我不认为这是最好的做法。
任何人都可以帮我不确定该怎么做。提前谢谢。
答案 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。