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模式。
