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>
- Android之Handler在新线程中读取网络的两种方法
- Android之Handler在新线程中读取网络的两种方法
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android之Handler在新线程中处理消息
- Android Handler/Looper/MessageQueue 在新线程中使用Handler
- 新线程中创建Handler的方法
- Android Handler在新线程中处理消息
- Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息
- 学习在新线程中使用Handler更新UI的方法
- Android使用Handler的两种方法
- 在Java中实现线程的两种方法
- 延时执行的两种方法(在线程中)
- android编程之在单线程模型中Message、Handler、Message Queue、Looper之间的关系
- 下面的程序实现了在利用Handler在新线程当中处理消息的方法
- 『ANDROID』 在Android开发过程中,常Android 更新UI的两种方法——handler和runOnUiThread()
- Android--Handler的使用方法:在子线程中更新界面
- POJ 2488 A Knight's Journey
- 关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决
- Unity3d BTDF实时折射模拟有粗糙度的半透明物体
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS
- Maven简单命令
- Android之Handler在新线程中读取网络的两种方法
- BZOJ_P2330 [SCOI2011]糖果(差分约束+最长路)
- AlphaGo打星际,人类的胜算几何?
- BZOJ 3720 gty的妹子树
- 如何加载包下面的所有类?
- Volley使用JsonObjectRequest发送Post请求失败
- C++学习笔记
- Java数据类型
- 【bzoj3288】Mato矩阵 线性筛法