我的数据库管理器类中的以下函数引发错误: 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;
}发布于 2012-03-21 19:20:03
使用AsyncTask。或者使用带有内联匿名Runnable的Runnable作为参数。后者比较容易,IMHO。
new Thread(new Runnable(){
public void run()
{
DefaultHttpClient mHttpClient = new DefaultHttpClient();
//And so forth...
//...
}
}).start();若要使外部变量(如url)对匿名类可见,请将它们标记为final。
发布于 2013-12-16 10:03:13
使用异步任务可能更好,因为它比线程级别更高
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);
}
}发布于 2012-03-21 19:16:30
您将得到此异常,因为您正在UI线程中运行阻塞代码。您必须使用线程或AsyncTask在后台运行它。检查一下这个android 指南
https://stackoverflow.com/questions/9811323
复制相似问题