我知道,當你試圖在UI線程上做某種網絡請求時,會發生這個錯誤,但正如你在下面的代碼中看到的,我實際上調用了Http在AsyncTask中獲取:在AsyncTask中的android.os.NetworkOnMainThreadException
public class LeftPaneFragment extends Fragment {
private ImageView _profileImage;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(wj.tweetTab.R.layout.left_pane, container);
_profileImage = (ImageView) view.findViewById(R.id.profileImage);
setUpProfileInfo(view);
return view;
}
private void setUpProfileInfo(View view) {
new SetUpUserInfo().doInBackground();
}
private class SetUpUserInfo extends AsyncTask<Void, Void, Drawable> {
@Override
protected Drawable doInBackground(Void... params) {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(_model.UserInfo.ProfileImageUrl);
InputStream inputStream = null;
try {
HttpResponse response = httpClient.execute(request);
inputStream = response.getEntity().getContent();
}
catch (Exception e) {
Log.e("setUpUserInfo.doInBackground", e.getMessage());
}
return Drawable.createFromStream(inputStream, "src");
}
@Override
protected void onPostExecute(Drawable result) {
_profileImage.setImageDrawable(result);
}
}
}
任何人都可以在這裏看到任何明顯的問題?除了在主線程中執行http請求之外,還可以因爲其他原因拋出NetworkOnMainThreadException
異常嗎?
我是Android的新手,只用了幾天。
啊哈謝謝你我的朋友! – jcvandan
我已經絆倒了好幾次,並且已經接近使用線程多次(啓動與運行)。爲什麼'doInBackground()'在它沒用時甚至可用? – 2013-04-26 19:50:20
呃......你的意思是「可用」是什麼意思?首先,它是'protected',這意味着你不應該從AsyncTask之外的類中調用它。不幸的是,許多人只是聲明AsyncTasks內聯,以便他們可以(並且)調用'doInBackground()'。 'execute()'然而,*是*'public'。 – dmon