亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

深入Android線程的相關問題解惑

2020-04-11 12:23:11
字體:
來源:轉載
供稿:網友
一個應用只有一個線程
在默認情況下,更確切的講一個進程中只有一個線程,這跟其他語言,比如C/C++,Java等是一致。也就是說在Android應用程序里面一個進程只有一個線程,所有組件都運行在一個線程里面!

當應用程序啟動時,系統會為其創建一個進程,也會創建一個線程名字叫做main,所有其所屬組件的創建,系統事件的處理,系統的回調等一切應用相關的事情都運行在此名叫main的線程中。此線程即為常說的主線程(main thread)。俗稱的UI線程(UI thread)也是它,因為只有主線程可以操作UI相關的事情,所以有人把主線程也稱作UI線程,但這并不是正確的說法,因為Service所屬的線程也可以操作Toast,但是Service并沒有UI。為什么非主線程不能操作UI呢?因為對UI操作常常會引發系統的回調,所以如果允許第三線程來操作可能會引發系統回調的紊亂,進而會打亂整個框架的時序!
這里要特別注意的就是同一個進程中的所有組件運行在同一個線程中,Activiy,Service,BoradcastReceiver和ContentProvider都運行在主線程中。

最容易引起誤解的就是Service,文檔和常識都會認為Service是放在后臺用于操作費時運算的,但是實則不然,如果你在Service中做費時操作,同樣會引發臭名昭著的ANR(Application Not Responding)。所以如果想把Service當做一個Server,必須在Service用HandlerThread或Thread創建一個Worker線程!
Activity也是一樣的,你startActivity()后,開啟了一個新的Activity,但它們都運行在同一個線程中,所以你還是不能在原Activity中做費時操作!也即在調用startActivity()開啟了一個新的Activity后,或者在onPause(), onStop(), onDestroy()中做費時操作會引發ANR。

對于ContentProvider也是一樣的,如果跟其他組件在同一進程內,那么調用ContentResolver的方法會相當于直接調用ContentProvider的方法。如果是在另外一個進程中,雖是通過IPC,但也是同步的,因為IBinder的同步的,也即調用ContentResolver時會把調用者的進程掛起,等待ContentProvider的進程操作結束,再把結果傳給調用者進程!所以,如果ContentProvider中有費時操作,或者會同步鎖數據庫等,也一定要注意ANR的發生!
所以一定要記?。阂粋€進程只有一個線程,所有組件都運行在主線程中。
因此,如果有費時操作,必須要創建Worker線程!

實例
下面有一個小實例,一個應用中有五個組件:2個Activity,一個Service,一個ContentProvider和一個BroadcastReceiver。在每個組件的方法中都有打印所屬線程信息,另外對于Activity,Service和ContentProvider如果做費時操作會引發ANR,對于BroadcastReceiver更是如此,這個大家都懂得的!
復制代碼 代碼如下:

public class ActivityDemo extends Activity {
    private static final String TAG = "ActivityDemo";
    private Handler mMainHandler = new Handler(new Handler.Callback() {
 public boolean handleMessage(Message msg) {
     dumpThreadInfo();
     return false;
 }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
 dumpThreadInfo();
 super.onCreate(savedInstanceState);

 // add four buttons
 LinearLayout layout = new LinearLayout(getApplication());
 layout.setOrientation(LinearLayout.VERTICAL);
 Button startService = new Button(getApplication());
 startService.setText("Start a Service");
 startService.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  Intent i = new Intent(getApplication(), ServiceDemo.class);
  startService(i);
     }
 });
 layout.addView(startService);
 Button startAnother = new Button(getApplication());
 startAnother.setText("Start another Activity");
 startAnother.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  Intent i = new Intent(getApplication(), AnotherActivity.class);
  startService(i);
     }
 });
 layout.addView(startAnother);
 Button startContentProvider = new Button(getApplication());
 startContentProvider.setText("Start a ContentProvider");
 startContentProvider.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  getContentResolver().query(ContentProviderDemo.CONTENT_URI, null, null, null, null);
     }
 });
 layout.addView(startContentProvider);
 Button startReceiver = new Button(getApplication());
 startReceiver.setText("Start a BroadcastReceiver");
 startReceiver.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
  Intent i = new Intent("android.action.start_broadcastreceiver_demo");
  sendBroadcast(i);
     }
 });
 layout.addView(startReceiver);
 setContentView(layout);

 mMainHandler.sendEmptyMessageDelayed(0, 500);
    }

    public void dumpThreadInfo() {
 Thread.dumpStack();
 Log.e(TAG, Thread.currentThread().toString());
 Log.e(TAG, " " + getMainLooper());
    }
}

復制代碼 代碼如下:

public class AnotherActivity extends Activity {
    private static final String TAG = "AnotherActivity";
    private Handler mMainHandler = new Handler(getMainLooper(), new Handler.Callback() {
        public boolean handleMessage(Message msg) {
            // this will cause ANR
            Log.e(TAG, "you know what this is very slow slow slow slow");
            SystemClock.sleep(20 * 1000);
            dumpThreadInfo();
            return false;
        }
    });
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 dumpThreadInfo();
 super.onCreate(savedInstanceState);

 setTitle("this is another activity");
 mMainHandler.sendEmptyMessageDelayed(0, 500);
    }
    @Override
    protected void onDestroy() {
 dumpThreadInfo();
 super.onDestroy();
    }
    public void dumpThreadInfo() {
 Thread.dumpStack();
 Log.e(TAG, Thread.currentThread().toString());
 Log.e(TAG, " " + getMainLooper());
    }
}

復制代碼 代碼如下:

public class ServiceDemo extends Service {
    private Handler mMainHandler = new Handler(new Handler.Callback() {
        public boolean handleMessage(Message msg) {
            // this will cause ANR, too
            Log.e(TAG, "this is very slow you know, slow slow");
            SystemClock.sleep(20 * 1000);
            dumpThreadInfo();
            return false;
        }
    });
    private static final String TAG = "ServiceDemo";
    @Override
    public IBinder onBind(Intent arg0) {
 dumpThreadInfo();
 return null;
    }
    @Override
    public void onCreate() {
 dumpThreadInfo();
 super.onCreate();
 mMainHandler.sendEmptyMessageDelayed(0, 500);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
 dumpThreadInfo();
 return super.onStartCommand(intent, flags, startId);
    }

    public void dumpThreadInfo() {
 Thread.dumpStack();
 Log.e(TAG, Thread.currentThread().toString());
 Log.e(TAG, " " + getMainLooper());
    }
}

復制代碼 代碼如下:

public class ContentProviderDemo extends ContentProvider {
    public static final Uri CONTENT_URI = Uri.parse("content://com.hilton.effectiveandroid.app/content");
    private static final String TAG = "ContentProviderDemo";
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
 dumpThreadInfo();
 return 0;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
 dumpThreadInfo();
 return null;
    }
    @Override
    public boolean onCreate() {
 dumpThreadInfo();
 return false;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
 dumpThreadInfo();
 // it will cause ANR of course
 Log.e(TAG, "this is very slow, you know that");
 SystemClock.sleep(20 * 1000);
 return null;
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
 dumpThreadInfo();
 return 0;
    }

    public void dumpThreadInfo() {
 Thread.dumpStack();
 Log.e(TAG, Thread.currentThread().toString());
    }
    @Override
    public String getType(Uri arg0) {
 return null;
    }
}

復制代碼 代碼如下:

public class BroadcastReceiverDemo extends BroadcastReceiver {
    private static final String TAG = "BroadcastReceiverDemo";
    @Override
    public void onReceive(Context context, Intent intent) {
 Log.e(TAG, "intent is " + intent);
 dumpThreadInfo();
    }

    public void dumpThreadInfo() {
 Thread.dumpStack();
 Log.e(TAG, Thread.currentThread().toString());
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本中文字幕| 亚洲福利视频在线| 亚洲欧美中文日韩在线v日本| 欧美日韩视频在线| 欧美激情18p| 亚洲最大福利视频网| 成人午夜在线观看| 日韩亚洲精品电影| 亚洲欧美制服第一页| 日韩高清电影好看的电视剧电影| 中国日韩欧美久久久久久久久| 国产日韩换脸av一区在线观看| www.日韩不卡电影av| 国产亚洲一区精品| 久久国产精品免费视频| 国产成人精品国内自产拍免费看| 日韩一区视频在线| 久久精品一本久久99精品| 日韩成人中文电影| 亚洲a一级视频| 亚洲电影天堂av| 日韩成人在线播放| 国精产品一区一区三区有限在线| 国产精品都在这里| 日韩欧美中文字幕在线播放| 欧美又大粗又爽又黄大片视频| 精品偷拍各种wc美女嘘嘘| 欧美性视频精品| 中文字幕日韩欧美精品在线观看| 精品欧美一区二区三区| 欧美国产亚洲精品久久久8v| 成人午夜在线视频一区| 色综合伊人色综合网站| 国产自产女人91一区在线观看| 久久久久久久电影一区| 色综合久综合久久综合久鬼88| 国产伦精品一区二区三区精品视频| 国产狼人综合免费视频| 欧美高清一级大片| 欧美中文在线视频| 色偷偷888欧美精品久久久| 国内揄拍国内精品少妇国语| 日韩av免费看| 欧美性jizz18性欧美| 色中色综合影院手机版在线观看| 亚洲精品动漫100p| 久久久久久久久久av| 欧美裸体xxxx| 久久人91精品久久久久久不卡| 视频直播国产精品| 亚洲国产成人久久综合一区| 中文字幕欧美国内| 亚洲aⅴ男人的天堂在线观看| 亚洲第一精品夜夜躁人人爽| 久久亚洲精品一区| 中文字幕亚洲欧美一区二区三区| 久久精品国产一区| 精品高清一区二区三区| 亚洲一区二区三区四区在线播放| 亚洲美女视频网| 国产精品亚发布| 国产一区二区三区直播精品电影| 国产精品a久久久久久| 日韩亚洲一区二区| 欧美激情精品久久久久久黑人| 亚洲精品自拍第一页| 精品香蕉在线观看视频一| 亚洲mm色国产网站| 日韩一区二区久久久| 日本欧美精品在线| 精品久久久av| 国产精品九九九| 欧美中文字幕视频| 成人精品一区二区三区| 亚洲色图17p| 日韩中文字幕网站| 欧美精品久久久久久久免费观看| 一级做a爰片久久毛片美女图片| 欧美激情视频在线免费观看 欧美视频免费一| 欧美成人网在线| 久久精品国产亚洲精品| 91在线直播亚洲| 欧美第一页在线| 自拍偷拍免费精品| 欧美另类99xxxxx| 91干在线观看| 亚洲欧美国产va在线影院| 亚洲欧洲自拍偷拍| 亚洲综合av影视| 久久理论片午夜琪琪电影网| 亚洲精品电影在线| 日韩中文字幕在线观看| 亚洲美女av网站| 欧美日本中文字幕| 国产精品日韩在线| 色综合色综合网色综合| 欧美日韩国产综合视频在线观看中文| 久久视频免费观看| 亚洲精品按摩视频| 久久精品国产2020观看福利| 国产精品女人久久久久久| 亚洲男人天堂古典| 亚洲欧美日本伦理| 欧美裸体xxxx极品少妇软件| 亚洲一区二区福利| 国外成人在线播放| 国产精品www网站| 久久九九亚洲综合| 国产精品美乳一区二区免费| 亚洲欧美自拍一区| 韩国日本不卡在线| 国产精品专区第二| 97国产精品视频人人做人人爱| 色综合伊人色综合网站| 日本最新高清不卡中文字幕| 亚洲国产日韩欧美在线图片| 日韩精品在线视频美女| 国产欧美精品xxxx另类| 久久综合伊人77777尤物| 欧洲亚洲免费在线| 亚洲欧美日韩爽爽影院| 中文字幕在线视频日韩| 欧美精品性视频| 久久青草福利网站| 亚洲欧美综合区自拍另类| 日韩精品一区二区三区第95| 不卡在线观看电视剧完整版| 福利视频导航一区| 久久亚洲春色中文字幕| 最近2019年中文视频免费在线观看| 91chinesevideo永久地址| 欧美大全免费观看电视剧大泉洋| 亚洲一区二区久久久| 精品国产一区二区三区久久久狼| 日韩精品999| 欧美激情va永久在线播放| 亚洲欧美综合图区| 4444欧美成人kkkk| 国产精品久久电影观看| 日韩精品一区二区视频| 久久久人成影片一区二区三区| 97av在线播放| 欧美韩国理论所午夜片917电影| 国产激情久久久久| 精品福利在线视频| 成人激情综合网| 日本精品视频在线播放| 亚洲第一页在线| 亚洲美女www午夜| 97在线免费观看视频| 日韩小视频网址| 国产成人福利视频| 日韩亚洲在线观看| 亚洲成人精品久久| 久久久久久com| 亚洲一区二区三区四区在线播放| 91精品久久久久久综合乱菊| 久久精品国产亚洲精品| 亚洲精品成人网| 91精品国产亚洲| 亚洲欧美日韩中文在线制服| 91精品视频免费观看| 亚洲国产中文字幕在线观看| 欧美性受xxxx黑人猛交|