在我的应用程序中,我得到了android。操作系统。NetworkOnMainThreadException。我正在尝试从url获取图像,当时我遇到了这个异常。若我在2.2中运行应用程序,它可以正常工作,但若我在4.0中运行,就会出现异常。
public static Bitmap getBitmap(String url)
{
Bitmap bitmap = null;
try
{
// replace space with url encoded character.
url = url.replace(" ", "%20");
// System.out.println("url : " + url);
URL urll = new URL(url);
InputStream in = (InputStream) urll.getContent();
bitmap = BitmapFactory.decodeStream(in);
}
catch ( MalformedURLException e )
{
e.printStackTrace();
}
catch ( IOException e )
{
e.printStackTrace();
}
if ( bitmap == null )
bitmap = BitmapFactory.decodeResource(resources, R.drawable.noimage);
return bitmap;
}
我有错误
InputStream in = (InputStream) urll.getContent();
在这一行请帮我解决这个问题
我使用了AsyncTask
private class RecipeDetail1Task extends AsyncTask<Long, Void, RecipeDetailBean>
{
@Override
protected void onPreExecute()
{
Log.i(TAG, "<<<<<<<<<<<<<onPreExecute>>>>>>>>>>>>>>>>>>>");
btnViewRecipe.setEnabled(false);
imgFree.setVisibility(View.GONE);
}
@Override
protected RecipeDetailBean doInBackground(Long... params)
{
Log.i(TAG, "<<<<<<<<<<<<<doInBackground>>>>>>>>>>>>>>>>>>>");
RecipeDetailBean bean = null;
try
{
ParserUtil pu = new ParserUtil(ParserUtil.ResultControl.LIMITED);
bean = pu.getRecipeDetail(params[0]);
}
catch ( ParserConfigurationException e )
{
e.printStackTrace();
}
catch ( SAXException e )
{
e.printStackTrace();
}
return bean;
}
protected void onPostExecute(RecipeDetailBean result)
{
Log.i(TAG, "<<<<<<<<<<<<<onPostExecute>>>>>>>>>>>>>>>>>>>");
Constant.recipeDetail = result;
if ( result == null )
{
Log.i(TAG, "<<<<<<<<<<<<<result == null>>>>>>>>>>>>>>>>>>>");
toast.setText(getString(R.string.recipe_detail_not_present_message));
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
Constant.recipeDetail = new RecipeDetailBean();
btnViewRecipe.setEnabled(false);
}
else
{
Log.i(TAG, "<<<<<<<<<<<<<result |= null>>>>>>>>>>>>>>>>>>>");
//pb.setVisibility(View.INVISIBLE);
btnViewRecipe.setEnabled(true);
lblRecipeName.setText(result.getName());
lblRecipeDesc.setText(result.getDescription());
lblRecipeBy.setText(result.getAuthor());
lblPostedOn.setText(result.getCreatedDate());
String d=Integer.toString(result.getServedNumber());
if(d==null)
{
lblServesNumber.setText("N/A");
lblServesNumber1.setText("");
}
else if(result.getServedNumber()==0)
{
lblServesNumber.setText("N/A");
lblServesNumber1.setText("");
}
else
{
lblServesNumber.setText(d);
lblServesNumber1.setText(" Adult(s)");
}
if(Constant.recipeDetail.getFreeYN() == 1)
imgFree.setVisibility(View.VISIBLE);
//rbRecipeRating.setProgress((int) result.getRating());
rbRecipeRating.setRating((float) ( (result.getRating() * 5) / 100 ));
//Log.d("rating2", "" + (float) ( (result.getRating() * 5) / 100.0f ));
result.setRecipeBitmap(Constant.getBitmap(result.getImageURL()));
imgRecipe.setImageBitmap(result.getRecipeBitmap());
imgRecipe.setVisibility(View.VISIBLE);
//ImageLoader imageLoader = new ImageLoader(imgRecipe, pb, null);
//imageLoader.execute(result.getImageURL());
}
btnViewRecipe.requestFocus();
}
}
我在这行中遇到了错误:
result.setRecipeBitmap(Constant.getBitmap(result.getImageURL()));
Logcat:
09-27 13:14:11.445: E/AndroidRuntime(1014): FATAL EXCEPTION: main
09-27 13:14:11.445: E/AndroidRuntime(1014): android.os.NetworkOnMainThreadException
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
09-27 13:14:11.445: E/AndroidRuntime(1014): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
09-27 13:14:11.445: E/AndroidRuntime(1014): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
09-27 13:14:11.445: E/AndroidRuntime(1014): at java.net.InetAddress.getAllByName(InetAddress.java:220)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
09-27 13:14:11.445: E/AndroidRuntime(1014): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
09-27 13:14:11.445: E/AndroidRuntime(1014): at com.indianrecipes.beans.Constant.getBitmap(Constant.java:239)
09-27 13:14:11.445: E/AndroidRuntime(1014): at com.indianrecipes.activities.RecipeDetail1Activity$RecipeDetail1Task.onPostExecute(RecipeDetail1Activity.java:376)
09-27 13:14:11.445: E/AndroidRuntime(1014): at com.indianrecipes.activities.RecipeDetail1Activity$RecipeDetail1Task.onPostExecute(RecipeDetail1Activity.java:1)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.AsyncTask.finish(AsyncTask.java:602)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.AsyncTask.access$600(AsyncTask.java:156)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.os.Looper.loop(Looper.java:137)
09-27 13:14:11.445: E/AndroidRuntime(1014): at android.app.ActivityThread.main(ActivityThread.java:4340)
09-27 13:14:11.445: E/AndroidRuntime(1014): at java.lang.reflect.Method.invokeNative(Native Method)
09-27 13:14:11.445: E/AndroidRuntime(1014): at java.lang.reflect.Method.invoke(Method.java:511)
09-27 13:14:11.445: E/AndroidRuntime(1014): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-27 13:14:11.445: E/AndroidRuntime(1014): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-27 13:14:11.445: E/AndroidRuntime(1014): at dalvik.system.NativeStart.main(Native Method)
尝试此代码
URL urll = new URL(url);
InputStream in = (InputStream) urll.openConnection().getInputStream();
bitmap = BitmapFactory.decodeStream(in);
获取图像也应该以某种方式在doInbackground
方法中完成...因为在onPostExecute
中执行它就像在主线程中而不是在后台中执行一样...
onPostExecute
和onPreExecute
Async任务
的方法运行到应用程序的主线程
中。doInbackground
方法运行到另一个线程中,这意味着您应该将映像下载到doInbackground
方法中。
例如,如果您想从某个URL下载图像,然后将该图像放入ImageView
:
呼叫:
新的DownloadImageTask(yourImageView).执行(yourURL);
其中async任务类是:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
private ProgressDialog mDialog;
private ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected void onPreExecute() {
mDialog = ProgressDialog.show(ChartActivity.this,"Please wait...", "Retrieving data ...", true);
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", "image download error");
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
//set image of your imageview
bmImage.setImageBitmap(result);
//close
mDialog.dismiss();
}
}
操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成
sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的
问题内容: 我已经做了一些研究,但这个问题已经提出,但不是我打算的那样。我正在为QR登陆的客户端构建页面,这是一个下载应用程序的地方。因此,他不必在页面上打印2个QR码,我想检测当前的操作系统(Apple / Android / Other [不支持])并根据该值修改我的元素。 我已经看过脚本“ detectmobilebrowsers”,它的目的只是告诉用户是否完全可以移动,而我想弄清楚用户正在
进程与线程 对于有线程系统: 进程是资源分配的独立单位 线程是资源调度的独立单位 对于无线程系统: 进程是资源调度、分配的独立单位 进程之间的通信方式以及优缺点 管道(PIPE) 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信 优点:可以实现任意关系的进程间的通信 缺点: 长期存于系统中,使用不当容易出错 缓冲区有限 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父
1 select,poll和epoll 其实所有的I/O都是轮询的方法,只不过实现的层面不同罢了. 这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好的了解了.其中tornado使用的就是epoll的. selec,poll和epoll区别总结 基本上select有3个缺点: 连接数受限 查找配对速度慢 数据由内核拷贝到用户态 poll改善了第一个缺点 epoll改了三个缺点.
你可以在任何主流操作系统下去做开发工作,Windows,macOS,Linux 都可以。如果选择 Windows ,版本最好选择 Windows 10 专业版。用 macOS 的用户不用太担心系统问题,可以无痛并免费升级,现在你应该用的是 Sierra 这个版本的 macOS 。Linux 也可以,比如 Ubuntu 的桌面版。 如果你能满足下面三个条件的其中一个,这个任务就算完成了: Windo