首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取NetworkOnMainThread异常

获取NetworkOnMainThread异常
EN

Stack Overflow用户
提问于 2012-03-21 19:13:26
回答 3查看 4.2K关注 0票数 0

我的数据库管理器类中的以下函数引发错误: android.os.NetworkOnMainThreadException

这个函数作为一个公共方法存在于我创建的DataBaseManager类中,它扩展了SQLiteOpenHelper,我猜想这是因为它需要发生在后台,但是我不确定如何设置它。有人能帮忙吗?

代码语言:javascript
复制
public byte[] getBlobFromURL(String url) {
        byte[] blobData = null;
        DefaultHttpClient mHttpClient = new DefaultHttpClient();  
        HttpGet mHttpGet = new HttpGet(url);  
        HttpResponse mHttpResponse;
        try {
            mHttpResponse = mHttpClient.execute(mHttpGet);
            if (mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  

            HttpEntity entity = mHttpResponse.getEntity();
            if ( entity != null) {  

             //ContentValues values = new ContentValues();  
             blobData = EntityUtils.toByteArray(entity);  
             //mContext.getContentResolver().insert(MyBaseColumn.MyTable.CONTENT_URI, values);  
            } 
        } 
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return blobData;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-21 19:20:03

使用AsyncTask。或者使用带有内联匿名RunnableRunnable作为参数。后者比较容易,IMHO。

代码语言:javascript
复制
new Thread(new Runnable(){
    public void run()
    {
        DefaultHttpClient mHttpClient = new DefaultHttpClient();   
        //And so forth...
        //...
    }
}).start();

若要使外部变量(如url)对匿名类可见,请将它们标记为final

票数 2
EN

Stack Overflow用户

发布于 2013-12-16 10:03:13

使用异步任务可能更好,因为它比线程级别更高

代码语言:javascript
复制
private class GetDataTask extends AsyncTask<Void, Void, String> {

        private String urlToGet = baseUrl;

        public GetDataTask() {

        }                       

        @Override
        protected String doInBackground(Void... params) {

            try {                                       

                result = getUrlContent(this.urlToGet);                                                                              

            } catch (Exception e) {                 

            }

            if (isCancelled()) { 
                return null;
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {               
            setData(result);
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2012-03-21 19:16:30

您将得到此异常,因为您正在UI线程中运行阻塞代码。您必须使用线程或AsyncTask在后台运行它。检查一下这个android 指南

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9811323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档