android学习之网络图片查看器

来源:互联网 发布:青岛中德生态园 知乎 编辑:程序博客网 时间:2024/05/22 02:30

首先,做这个小程序的时候是看的传智播客11年的视频,当时安卓只有2.2版本,而按照当时视频的代码敲打下来,发现程序根本无法与运行。

在这里给和我一样的新手们分享我做这个小程序的心得。

我在做这个程序的时候解决了2个比较关键的问题:

1.在调用HttpURLConnection类的 getResponseCode();方法的时候会返回一个android.os.NetworkOnMainThreadException异常

解决方法:android2.3的版本已经无法在主线程处理网络的请求了,于是,我们可以把获取网络图片的方法,放在Runnable的run方法中调用。

关键代码如下:

Thread t = new Thread(new Runnable() {@Overridepublic void run() {//service是获取网络图片的方法,strurl是url地址的字符串service(strurl);}});t.start();

2.但是当运行上面代码的时候,发现了当代码运行到service方法的时候,会抛出下面的异常

Can't create handler inside thread that has not called Looper.prepare()

解决方法,在service前后作如下处理:

Thread t = new Thread(new Runnable() {@Overridepublic void run() {//service是获取网络图片的方法,strurl是url地址的字符串                        Looper.prepare();service(strurl);                        Looper.loop();}});t.start();

因为默认情况下Android中新诞生的线程是没有开启消息循环的.(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环)
Looper类别用来为一个线程开启一个消息循环,Looper对象通过MessageQueue来存放消息和事件.一个线程只能有一个Looper,对应一个MessageQueue.
关于Looper类和线程我会在文章结尾贴出2个相关链接供大家参考。
下面贴出我的代码和程序运行效果:

package com.ckp.webimage;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import com.ckp.imageservice.ImageService;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.annotation.SuppressLint;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.os.StrictMode;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;import android.os.Build;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (savedInstanceState == null) {getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}/** * A placeholder fragment containing a simple view. */public static class PlaceholderFragment extends Fragment {Button bShow = null;ImageView imageview = null;EditText editUrl = null;public PlaceholderFragment() {}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.fragment_main, container,false);return rootView;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onActivityCreated(savedInstanceState);bShow = (Button) getView().findViewById(R.id.bShow);imageview = (ImageView) getView().findViewById(R.id.imageView1);editUrl = (EditText) getView().findViewById(R.id.editUrl);editUrl.setText("http://a.hiphotos.baidu.com/image/pic/item/f7246b600c338744ebc2527d530fd9f9d72aa0af.jpg");bShow.setOnClickListener(new ButtonListner());}//按钮响应处理private class ButtonListner implements View.OnClickListener{@Overridepublic void onClick(View v) {final String strurl = editUrl.getText().toString();Thread t = new Thread(new Runnable() {@Overridepublic void run() {Looper.prepare();service(strurl);Looper.loop();}});t.start();}}//onclick//把所有的网络操作的图片都放到这个方法里面,因为没有把各种可重用代码封装起来,看起来更清晰public void service(String strurl){try {URL url = new URL(strurl);HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();httpcon.setConnectTimeout(5000);httpcon.setReadTimeout(5000);httpcon.setRequestMethod("GET");if(httpcon.getResponseCode() == 200){InputStream inStream = httpcon.getInputStream();byte[] buffer = new byte[1024];ByteArrayOutputStream byteStream = new ByteArrayOutputStream();int len = 0 ;while((len = inStream.read(buffer))!= -1){byteStream.write(buffer,0,len);}Bitmap bm = BitmapFactory.decodeByteArray(byteStream.toByteArray(), 0, byteStream.toByteArray().length);imageview.setImageBitmap(bm);}} catch (Exception e) {e.printStackTrace();}}}}
以下是程序运行的效果图:


这个程序从出错到解决一共用了我2天的时间,分享这些代码和问题解决的方法希望能够帮助到更多像我这样的android学习新手
下面是2个对我问题解决帮助很大的资料链接:
http://blog.csdn.net/SamLee1989/article/details/8289631
http://blog.csdn.net/jackchen95/article/details/13631761


0 0
原创粉丝点击