Android之Handler在新线程中读取网络的两种方法

来源:互联网 发布:sip协议端口号 编辑:程序博客网 时间:2024/06/06 11:37

方法一:

创建一个Thread,然后调用start方法。

实例

<code class="hljs java">package com.example.android_handle; import java.io.BufferedInputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection; import org.apache.http.util.ByteArrayBuffer; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView; public class MainActivity extends Activity {     private Button start;    private TextView text;     Handler handler = new Handler() {         @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            text.append(msg.obj + "\n");        }     };     Runnable newTread = new Runnable() {        String content;         @Override        public void run() {            // TODO Auto-generated method stub            // 网络处理            // 首先获得一个消息结            Message msg = handler.obtainMessage();            // 给消息结构的arg1参数赋值            try {                URL uri = new URL("http://112.74.78.53/scut-lib/"                        + "library/hotReading.php");                URLConnection ucon = uri.openConnection();                ucon.setConnectTimeout(10000);                InputStream is = ucon.getInputStream();                BufferedInputStream bis = new BufferedInputStream(is);                ByteArrayBuffer baf = new ByteArrayBuffer(100);                int current = 0;                while ((current = bis.read()) != -1) {                    baf.append((byte) current);                }                content = new String(baf.toByteArray(), "UTF-8");            } catch (Exception e) {                content = "error";            }            msg.obj = content;            handler.sendMessage(msg);        }     };     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        start = (Button) findViewById(R.id.start);        text = (TextView) findViewById(R.id.text);         start.setOnClickListener(new OnClickListener() {             @Override            public void onClick(View v) {                // TODO Auto-generated method stub                Thread t = new Thread(newTread);                t.start();            }         });    } }</code>

方法二:

利用android开发框架中的looper类来实现

Looper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止。通常情况下不会用到Looper,因为对于Activity,Service等系统组件,Frameworks已经为我们初始化好了线程(俗称的UI线程或主线程),在其内含有一个Looper,和由Looper创建的消息队列,所以主线程会一直运行,处理用户事件,直到某些事件(BACK)退出。

如果,我们需要新建一个线程,并且这个线程要能够循环处理其他线程发来的消息事件,或者需要长期与其他线程进行复杂的交互,这时就需要用到Looper来给线程建立消息队列。

使用Looper也非常的简单,它的方法比较少,最主要的有四个:
public static prepare();
public static myLooper();
public static loop();
public void quit();

使用方法如下:
1. 在每个线程的run()方法中的最开始调用Looper.prepare(),这是为线程初始化消息队列。
2. 之后调用Looper.myLooper()获取此Looper对象的引用。这不是必须的,但是如果你需要保存Looper对象的话,一定要在prepare()之后,否则调用在此对象上的方法不一定有效果,如looper.quit()就不会退出。
3. 在run()方法中添加Handler来处理消息
4. 添加Looper.loop()调用,这是让线程的消息队列开始运行,可以接收消息了。
5. 在想要退出消息循环时,调用Looper.quit()注意,这个方法是要在对象上面调用,很明显,用对象的意思就是要退出具体哪个Looper。如果run()中无其他操作,线程也将终止运行。

实例:

<code class="hljs java">package com.example.android_handle; import java.io.BufferedInputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection; import org.apache.http.util.ByteArrayBuffer; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.text.method.ScrollingMovementMethod;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView; public class MainActivity extends Activity {     private Button start;    private TextView text;    private Handler handler;    private NewThread thread;    private String s="";     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        start = (Button) findViewById(R.id.start);        text = (TextView) findViewById(R.id.text);        text.setMovementMethod(ScrollingMovementMethod.getInstance());          handler = new Handler() {             @Override            public void handleMessage(Message msg) {                // TODO Auto-generated method stub                s = s + msg.obj + "\n";                text.setText(s);            }         };         start.setOnClickListener(new OnClickListener() {             @Override            public void onClick(View v) {                // TODO Auto-generated method stub                thread = new NewThread();            }         });    }     private class NewThread extends Thread {        private Handler mHandler;        private Looper mLooper;        private String content;         public NewThread() {            start();        }         public void run() {            Looper.prepare();            mLooper = Looper.myLooper();            mHandler = new Handler(mLooper) {                 @Override                public void handleMessage(Message msg) {                    // TODO Auto-generated method stub                    Message newMsg = Message.obtain();                    newMsg.obj = msg.obj;                    handler.sendMessage(newMsg);                }             };            try {                URL uri = new URL("http://112.74.78.53/scut-lib/"                        + "library/hotReading.php");                URLConnection ucon = uri.openConnection();                ucon.setConnectTimeout(10000);                InputStream is = ucon.getInputStream();                BufferedInputStream bis = new BufferedInputStream(is);                ByteArrayBuffer baf = new ByteArrayBuffer(100);                int current = 0;                while ((current = bis.read()) != -1) {                    baf.append((byte) current);                }                content = new String(baf.toByteArray(), "UTF-8");            } catch (Exception e) {                content = e.toString();            }            Message msg = Message.obtain();            msg.obj = content;            mHandler.sendMessage(msg);            Looper.loop();        }     } }</code>


0 0
原创粉丝点击