AsyncTask中的android.os.NetworkOnMainThreadException

时间:2011-09-13 20:27:24

标签: java android

我意识到当您尝试在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的新手,几天才开始使用它。

2 个答案:

答案 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()函数中的

;