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更新