zoukankan      html  css  js  c++  java
  • 22、多进程和多线程

     Android进程简介

    Android会启动一个LINUX进程和一个主线程。默认的情况下,所 有该程序的组件都将在该进程中运行。当启动应用程序时,Linux会为每 一个程序单独分配一个进程,该进程默认只拥有一个主线程。

    组件可以运行在当前进程中,也可以运行在其他进程中。组件运行在 哪个进程中是在AndroidManifest.xml文件中设置的,其中<Activity>, <Service>,<receiver>和<provider>都有一个process属性来指定该 组件运行在哪个进程之中。

    每一个进程不会创建新的线程,所有的处理事件都是在主线程中完 成的,例如,onClick。 

    前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何 时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运 行的时候。一般来说, 在这种情况下,设备会进行内存调度,中止一些 前台进程来保持对用户交互的响应。 

    可见进程不包含前台进程的组件。但是会在屏幕上显示一个可见的UI。 除非前台进程需要获取它的资源,不然不会被中止。

    例如,如果前台Activity是一个对话框的话,就会允许在它后面看到 前一个Activity。 

    (后台进程)后台不可见的进程。例如,后台运行的Activity、Service等。 

    (空进程)未运行任何程序组件的线程。运行这些进程的唯一原因是作为一个缓 存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这 样可以调节程序缓存和系统缓存的平衡。 

     并发与UI更新

    Handler    Message 

     1 import android.app.Activity;
     2 import android.os.Bundle;
     3 import android.os.Handler;
     4 import android.os.Message;
     5 import android.view.View;
     6 import android.widget.TextView;
     7 
     8 public class UpdateUIActivity extends Activity {
     9     private TextView mTextView;
    10 
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_update_ui);
    15         mTextView = (TextView) findViewById(R.id.textView1);
    16     }
    17 
    18     public class NoHandler implements Runnable {
    19         @Override
    20         public void run() {
    21             try {
    22                 mTextView.setText("No Handler");
    23             } catch (Exception e) {
    24                 e.printStackTrace();
    25             }
    26         }
    27     }
    28 
    29     // 不使用Handler
    30     public void onClick_NoHandler(View view) {
    31         // mHandler.post(new NoHandler());
    32         Thread thread = new Thread(new NoHandler());
    33         thread.start();
    34     }
    35     
    36     // 使用Handler
    37     public void onClick_Handler(View view) {
    38         Thread thread = new Thread(new MyHandler(mHandler));
    39         thread.start();
    40     }
    41     
    42     public class MyHandler implements Runnable {
    43         private Handler mHandler;
    44 
    45         public MyHandler(Handler handler) {
    46             mHandler = handler;
    47         }
    48 
    49         @Override
    50         public void run() {
    51             Message message = new Message();
    52             message.obj = "Handler";
    53             mHandler.sendMessage(message);
    54         }
    55 
    56     }
    57 
    58     Handler mHandler = new Handler() {
    59         @Override
    60         public void handleMessage(Message msg) {
    61             String str = String.valueOf(msg.obj);
    62             mTextView.setText(str);
    63         }
    64     };
    65 
    66 }

     AsyncTask 

    AsyncTask<Params, Progress, Result> 需要指定三个泛型 

     1 import android.app.Activity;
     2 import android.os.AsyncTask;
     3 import android.os.Bundle;
     4 import android.view.View;
     5 import android.widget.ProgressBar;
     6 import android.widget.TextView;
     7 import android.widget.Toast;
     8 
     9 public class AsyncTaskActivity extends Activity {
    10     private ProgressBar mProgressBar;
    11     private TextView mTextView;
    12     private ProgressAsyncTask mProgressAsyncTask;
    13 
    14     @Override
    15     protected void onCreate(Bundle savedInstanceState) {
    16         super.onCreate(savedInstanceState);
    17         setContentView(R.layout.activity_async_task);
    18         mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
    19         mTextView = (TextView) findViewById(R.id.textView1);
    20     }
    21 
    22     private class ProgressAsyncTask extends AsyncTask<String, Integer, Integer> {
    23         private int mCount;
    24         @Override
    25         protected Integer doInBackground(String... params) {
    26             mProgressBar.setMax(params.length);
    27             mCount = params.length;
    28 
    29             for (int i = 0; i < mCount; i++) {
    30                 publishProgress(i + 1);
    31                 if (isCancelled())
    32                     break;
    33                 try {
    34                     Thread.sleep(2000);
    35                 } catch (Exception e) {
    36 
    37                 }
    38             }
    39             return params.length;
    40         }
    41 
    42         @Override
    43         protected void onPostExecute(Integer result) {
    44             super.onPostExecute(result);
    45             Toast.makeText(AsyncTaskActivity.this, "任务完成,共处理" + result + "个值.",
    46                     Toast.LENGTH_LONG).show();
    47         }
    48 
    49         @Override
    50         protected void onProgressUpdate(Integer... values) {
    51             super.onProgressUpdate(values);
    52             mProgressBar.setProgress(values[0]);
    53             mTextView.setText(100 * values[0] / mCount + "%");
    54         }
    55 
    56         @Override
    57         protected void onCancelled() {
    58             Toast.makeText(AsyncTaskActivity.this, "任务已取消", Toast.LENGTH_LONG)
    59                     .show();
    60 
    61             super.onCancelled();
    62         }
    63 
    64     }
    65 
    66     public void onClick_Start(View view) {
    67         mProgressAsyncTask = new ProgressAsyncTask();
    68         mProgressAsyncTask.execute("str1", "str2", "str3", "str4", "str5");
    69     }
    70 
    71     public void onClick_Cancel(View view) {
    72         mProgressAsyncTask.cancel(true);
    73     }
    74 }
  • 相关阅读:
    6-5 函数
    6-2 触发器
    4、MongoDB学习之备份还原
    3、MongoDB学习之固定集合
    2、MongoDB学习之索引的管理
    1、MongoDB学习之基本操作
    JS-01
    | 和 ||,& 和 && 的区别
    正则
    设计测试用例的经验总结
  • 原文地址:https://www.cnblogs.com/androidsj/p/3930016.html
Copyright © 2011-2022 走看看