получение исключения NetworkOnMainThread - PullRequest
0 голосов
/ 21 марта 2012

Следующая функция в моем классе менеджера баз данных выдает ошибку: android.os.NetworkOnMainThreadException

Эта функция существует как открытый метод в созданном мною классе DataBaseManager, который расширяет SQLiteOpenHelper. Я предполагаю, что это потому, что это должно происходить в фоновом режиме, но я не совсем уверен, как его настроить. Может кто-то помочь?

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;
    }

Ответы [ 4 ]

2 голосов
/ 16 декабря 2013

Может быть лучше использовать асинхронную задачу, так как она более высокого уровня, чем поток

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 голосов
/ 21 марта 2012

Это уже было довольно подробно рассмотрено, но прочитайте документацию по Безболезненная резьба Вы хотите выполнять сетевые вызовы в другом потоке, возможно, поместив его в метод doBackground для AsyncTask.

2 голосов
/ 21 марта 2012

Используйте AsyncTask.Или используйте Thread со встроенным анонимным Runnable в качестве аргумента.Последнее проще, ИМХО.

new Thread(new Runnable(){
    public void run()
    {
        DefaultHttpClient mHttpClient = new DefaultHttpClient();   
        //And so forth...
        //...
    }
}).start();

Чтобы сделать внешние переменные (например, url) видимыми для анонимного класса, пометьте их как final.

1 голос
/ 21 марта 2012

вы получаете это исключение, потому что вы выполняете код блокировки в потоке пользовательского интерфейса. Вы должны запустить его в фоновом режиме, используя поток или AsyncTask. Проверьте этот Android Guide

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...