android网络连接线程吗
1. Android开发中如何使用多线程
handler其实就是消息处理机制。首先在主线程也就是UI创建一个Handler对象,复写其中的handMessage( Message msg)方法。该方法里的msg就是子线程发来的消息,表示子线程处理完了,以这个msg来通知主线程。让主线程来作UI的绘制工作。
那么子线程工作完了就要发消息了,比如:
run(){
data = getDataFromInternet();//耗时工作
Message msg = handler.obtainMessage(0, data);//通过handler得到消息,该消息的标识为0,消息内容是data
handler.sendMessage(msg);//发送
}
然后handler在主线程就负责接收:
public Handler handler = new Handler(){//处理UI绘制
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
data = (List<Map<String, Object>>) msg.obj;
if(data == null){
Toast.makeText(AllMovieActivity.this, "网络连接失败,获取不到影片信息", 1).show();
}else {
adapter = new HotMoviedapter(AllMovieActivity.this, data, R.layout.allmovielist_item,
new String[] { "picurl", "chname", "director", "leadrole",
"fshowtime", "country" }, new int[] { R.id.picurl,
R.id.chname, R.id.director, R.id.leadrole,
R.id.fshowtime, R.id.country },mListView);
TextView v = new TextView(AllMovieActivity.this);
v.setHeight(80);
v.setSelectAllOnFocus(false);
mListView.addFooterView(v);
mListView.setAdapter(adapter);
}
break;
default:
break;
}
}
};
2. 请问开发android的朋友,怎么样在tcp socket中建立长连接,好像只能在线程里建立连接,线程关闭了就断了。
后台开启一个线程一直运行,每隔1分钟左右发送一个心跳报文给服务器,以确保时刻跟服务器链接。若超过3次服务器未对客户端发送的心跳报文做出回应则重新链接。 如果这么作的话,必须确保和服务器达成一定的应用层协议。
3. 简答题 Android要求联网的代码必须写在子线程中,请说明这样做的目的是什么
主线程是UI线程,频繁在UI线程执行长时间的联网操作会导致UI卡顿。
当子线程需要专更新UI时应该采用handler来处理属。
@Override
public void run(){
,,,,
//此处执行UI线程消息发送
//参数可以自定义一个常量
Message msg = handler.onMessage(MESSAGE_REFRESH_UI);
handler.sendMessage(msg);
}
再到handler的handMessage()方法中去处理就可以了
4. android大量数据网络上传框架怎么避免重复开启线程
是这样的,你在线程中读取网络数据,如果网络中断了,就会抛出一系列的异常 这时候,你就要捕获这些异常做不同的提示 以下是一些网络连接中常见的异常 // 处理网络异常 public String ExceptionCode(Exception e) { if(e instanceof HttpException) { return contextworkFailure); // 网络异常 }else if (e instanceof SocketTimeoutException) { return contextworkError); // 网络异常 }else if (e instanceof JSONException) { return context.getString(R.string.json_error); //json格式转换异常 }else { return context.getString(R.string.canNotGetConnected); // 无法连接网络 } }已经封装好了,你直接调用就好了
5. android 子线程访问网络超时怎么办
Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。
在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final int TIME_OUT = 0;
private static final int SUCCESS = 1;
// 超时的时限为5秒
private static final int TIME_LIMIT = 5000;
ProgressDialog proDialog;
Timer timer;
Thread thread;
Button btn1, btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
// 测试未超时的线程,为btn1绑定事件
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
proDialog = ProgressDialog.show(MainActivity.this, "提示",
"线程运行中");
// 匿名内部线程
thread = new Thread() {
@Override
public void run() {
while (true) {
try {
//线程休眠时间,超时
sleep(10000);
} catch (InterruptedException e) {
break;
}
}
}
};
thread.start();
// 设定定时器
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
sendTimeOutMsg();
}
}, TIME_LIMIT);
}
});
// 测试超时的线程,为btn2绑定事件
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
proDialog = ProgressDialog.show(MainActivity.this, "提示",
"线程运行中");
// 匿名内部线程
thread = new Thread() {
public void run() {
try {
// 线程休眠时间,未超时
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msgSuc = new Message();
msgSuc.what = SUCCESS;
myHandler.sendMessage(msgSuc);
}
};
thread.start();
// 设定定时器
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
sendTimeOutMsg();
}
}, TIME_LIMIT);
}
});
}
// 接收消息的Handler
final Handler myHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TIME_OUT:
//打断线程
thread.interrupt();
proDialog.dismiss();
Toast.makeText(MainActivity.this, "线程超时", Toast.LENGTH_SHORT)
.show();
break;
case SUCCESS:
//取消定时器
timer.cancel();
proDialog.dismiss();
Toast.makeText(MainActivity.this, "线程运行完成", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
};
};
//向handler发送超时信息
private void sendTimeOutMsg() {
Message timeOutMsg = new Message();
timeOutMsg.what = TIME_OUT;
myHandler.sendMessage(timeOutMsg);
}
}
6. android网络访问要在子线程,为什么okhttp还可以同步执行
估计底层做了一个处理,可以直接主线程里面进行更新。
7. android又一个方法要访问网络,所以要用多线程,这个方法有返回值,怎样返回外部方法(不能使用成
Handler
利用Hanlder来完成消息的传递
8. 为什么android网络要在分线程
Toast.makeText(getApplicationContext(), result, 1).show();
本质是进行UI更新
需要在主线程下调用
网络访问的处理结果需要通过handler发送消息
然后在handler内对接收到的不同消息进行分别处理
handler是运行在主线程下, 可以进行UI更新