繁体   English   中英

AsyncTask中的android.os.NetworkOnMainThreadException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM