所以我有一个问题,为什么我的函数getIt()
在httpGet
处中断并给出Exception
,在清单中我添加了INTERNET
权限!我没有使用AsyncTask,因为我需要创建一个新类,如果我用get
调用AsyncTask它会阻止我的UI
Class.java
public class loadMovies{
public String getIt(){
InputStream ips = null;
JSONObject json = null;
String get = "";
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://mysite/app/movies");
try {
HttpResponse response = client.execute(httpGet);
ips = response.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(ips));
StringBuilder builder = new StringBuilder();
String line;
while((line = buffer.readLine()) != null){
builder.append(line+"\n");
}
json = new JSONObject(builder.toString());
Log.d(TAG, json.toString());
}
catch(Exception e){ e.printStackTrace(); }
if(json != null){
JSONArray array = json.optJSONObject("data").optJSONArray("movies");
for(int i = 0; i < array.length(); i++){
JSONObject rss = array.optJSONObject(i);
get += rss.optString("name")+"\n";
}
}
return get;
}
}
答案 0 :(得分:1)
您的应用程序在Android 3.0及更高版本上崩溃的原因是因为HoneyComb,Ice Cream Sandwich和JellyBean对滥用UI线程更为严格。例如,当运行HoneyComb或更高版本的Android设备检测到UI线程上的网络访问时,将抛出NetworkOnMainThreadException:
E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException
Android开发人员网站上详细记录了解决这种情况的原因:
A NetworkOnMainThreadException is thrown when an application attempts to perform a networking operation on its main thread. This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.
ICS和HoneyComb不允许您在UI线程上执行的其他操作的一些示例是:
如果您尝试在UI线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用AsyncTask,它允许您在用户界面上执行异步工作。 AsyncTask将在工作线程中执行阻塞操作,并将结果发布到UI线程上,而不需要您自己处理线程和/或处理程序。
答案 1 :(得分:0)
如果我调用AsyncTask并使其阻止我的UI
因为正如doc所说的那样AsyncTask get ():
如果需要等待计算完成,然后检索 结果。
避免阻止用户界面使用AsyncTask
而不在UI线程上调用get
方法,并在doInBackground
执行完onPostExecute
时更新用户界面。
将AsyncTask类创建为:
public class LongloadMovies extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
loadMovies loadmovobj =new loadMovies();
String strresult=loadmovobj.getIt();
return strresult;
}
@Override
protected void onPostExecute(String result) {
// Update your UI here
}
}
从UI线程执行AsyncTask:
new LongloadMovies().execute("");
答案 2 :(得分:0)
您无法在主ui线程上进行网络操作。您需要在另一个线程或异步任务中执行此操作。 Here讨论这个