我意识到当您尝试在UI线程上执行某种网络请求时会发生此错误,但正如您在下面的代码中所看到的,我实际上是在AsyncTask中调用Http Get:
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的新手,几天才开始使用它。
答案 0 :(得分:23)
实际上,你不是。您需要调用但正如您在下面的代码中看到的那样,我实际上是在调用Http 进入AsyncTask
execute()
而不是直接调用doInBackground()
,否则您不会使用AsyncTask
提供的任何管道,而您只是直接在UI中调用该方法线程。
答案 1 :(得分:1)
也许Android SDK版本很高(版本&gt; = 3.0)。
尝试添加代码
导入android.os.StrictMode;
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
onCreateView()
函数中的;