码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-05-03 17:29:40      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:网络   android   多线程   

方法一:

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

实例:

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

        });
    }

}

方法二:

利用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()中无其他操作,线程也将终止运行。

实例:

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

    }

}

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

标签:网络   android   多线程   

原文地址:http://blog.csdn.net/woaic__/article/details/45459981

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!