[英]android.os.NetworkOnMainThreadException into AsyncTask
[英]android.os.NetworkOnMainThreadException in AsyncTask
我意识到当你尝试在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的新手,只用了几天就搞定了。
但正如您在下面的代码中看到的那样,我实际上是在AsyncTask中调用Http Get
实际上,你不是。 您需要调用execute()
而不是直接调用doInBackground()
,否则您不会使用AsyncTask
提供的任何管道,而只是直接在UI线程中调用该方法。
也许Android SDK版本很高(版本> = 3.0)。
尝试添加代码
import android.os.StrictMode;
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
在onCreateView()
函数中;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.