Android之Handler在新线程中读取网络的两种方法
方法一:
创建一个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();
}
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。