androidservice網路
『壹』 請教android service ANR問題
ANR: 很多初入Android開發的網友可能發現ANR的字樣,到底Android ANR是什麼呢? 其實ANR就是Application Not Responding的全稱,當某個應用處於長期假死狀態時Android系統會彈出一個窗口上面寫道,XXX is not responding給出兩個按鈕一個為force close一個為wait。 可能觸發ANR的情況 1. 長時間的I/O處理,比如讀寫大文件,網路訪問時造成的阻塞。 2. 執行耗時的運算,Android默認為超過5000ms即5秒開始彈出ANR窗口,某些應用可能首次執行時沒有緩存十分耗時,可以通過Splash播放閃屏Logo等方式來延緩載入 3. Service和appWidget中也要注意多線程的使用,除非它和Activity工作在不同的進程。 避免ANR的方法 1. 單獨開工作者線程,通過獨立的Thread或使用類似AsyncTask的方式來處理耗時的內容。 2. 耗時的操作盡量分段處理,使用類似狀態機的方法,類似Symbian的活動對象將一個復雜的事情,分段執行。 3. UI線程中不要處理過多的內容,比如將一個5MB的文本,讓TextView去setText,要知道這種UI操作,沒有什麼好方法去解決的,所以Android123提示,遇到UI中需要執行復雜的操作,可以參考上面2提到的分段處理方式。
『貳』 Android如何獲取網路連接狀態及怎樣調用網路配置界面
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetManager {
Context context;
public NetManager(Context context) {
this.context = context;
}
// 判斷網路是否可用的方法
public boolean isOpenNetwork() {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
return false;
}
// 判斷WIFI網路是否可用的方法
public boolean isOpenWifi() {
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifi.isConnected();
}
}
public static void netManager(final Context a) {
netManager = new NetManager(a);
if (!netManager.isOpenNetwork()) {
// 如果網路不可用,則彈出對話框,對網路進行設置
Builder builder = new Builder(a);
builder.setTitle("沒有可用的網路");
builder.setMessage("是否對網路進行設置?");
builder.setPositiveButton("確定",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = null;
try {
String sdkVersion = android.os.Build.VERSION.SDK;
if (Integer.valueOf(sdkVersion) > 10) {
intent = new Intent(
android.provider.Settings.ACTION_WIRELESS_SETTINGS);
} else {
intent = new Intent();
ComponentName comp = new ComponentName(
"com.android.settings",
"com.android.settings.WirelessSettings");
intent.setComponent(comp);
intent.setAction("android.intent.action.VIEW");
}
a.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
});
builder.setNegativeButton("取消",
null);
builder.show();
}else {
Toast.makeText(a, "網路不給力,請確認您的網路連接", Toast.LENGTH_LONG).show();
}
}
轉載,僅供參考。
『叄』 Android將所有網路請求及邏輯都放在Service中處理是否合適
不太合適,所有的都寫在一個地方,顯得代碼臃腫,不好維護,最好分層():網路請求只負責請求數據(c),對於數據處理的邏輯判斷,放到邏輯層(m),然後,對於頁面展示的放到activity裡面刷新視圖即可,這里只負責接收數據後刷新界面,不做任何判斷邏輯(v)。。。相當於mvc模式。