09-09 Service(續)、UI主線程、AsyncTask(UI主線程)

Service(續)

###IntentService 每次只執行一個服務,其餘服務等待,適合後臺耗時操作
//**MyIntentService(class文件)**
public class MyIntentService extends IntentService{
    private int count=0;
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public MyIntentService(String name) {
        super(name);
    }
    public MyIntentService() {
        this("");
    }
    //自帶線程,不用再聲明線程
    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("intentService", "運行到IntentService ");
        while (count<100){
            count++;
            //發送廣播
            Intent intent2=new Intent();
            intent2.setAction(MainActivity.DOWN_LOAN_ACTION);
            intent2.putExtra("count",count);
            sendBroadcast(intent2);
            //控制進度條的加載速度
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void onDestroy() {
        Log.d("", "onDestroy ");
        super.onDestroy();
    }
}


//**activity_main.xml**
<ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar"
        android:layout_gravity="center_horizontal"
        android:progress="0"/>
    <Button
        android:id="@+id/button_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="開始下載"/>

//**MyService(class文件)**
 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("", "onStartCommand ");
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (count<100){
                    count++;

                    //發送廣播
                    Intent intent=new Intent();
                    intent.setAction(MainActivity.DOWN_LOAN_ACTION);
                    intent.putExtra("count",count);
                    sendBroadcast(intent);

                    //控制進度條的加載速度
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }

//**MianActivity**
 mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
        //廣播的註冊
        myDownloadReceiver=new MyDownloadReceiver();
        IntentFilter filter=new IntentFilter();
        filter.addAction(DOWN_LOAN_ACTION);
        registerReceiver(myDownloadReceiver,filter);
        //接收廣播
    class MyDownloadReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            int count=intent.getIntExtra("count",0);
            mProgressBar.setProgress(count);
        }
    }

    //關閉Receiver,否則退出Activity後會報錯
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myDownloadReceiver);
    }
}

UI主線程

###主界面只能由主線程來操作,子線程不允許
//**activity_main.xml**
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="倒計時"/>
    <Button
        android:id="@+id/button_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="60秒"/>
    <Button
        android:id="@+id/button_tochild"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="發送消息給子線程"/>
</LinearLayout>

//**MainActivity**
public class MainActivity extends AppCompatActivity {
    private Button mButtonBack;
    private Button mButtonTochild;
    private int count=60;
    private static final int TIME_DESC=123;
    private Handler handler=new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case TIME_DESC:
                     /*
                        倒計時,子線程給主線程發送消息 一種寫法
                         */
//                    String time= (String) msg.obj;
//                    mButtonBack.setText(time);
                     /*
                        倒計時,子線程給主線程發送消息 另一種寫法
                         */
                    count--;
                    mButtonBack.setText(count+"秒");
                    if (count>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(TIME_DESC);
                    }
                    break;
                default:
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //倒計時
        mButtonBack= (Button) findViewById(R.id.button_back);
        mButtonBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        /*
                        倒計時,子線程給主線程發送消息 一種寫法
                         */
//                        while (count>0){
//                            count--;
//                            try {
//                                Thread.sleep(1000);
//                            } catch (InterruptedException e) {
//                                e.printStackTrace();
//                            }
//                            Message msg=handler.obtainMessage();
//                            msg.obj=count+"秒";
//                            msg.what=TIME_DESC;
//                            handler.sendMessage(msg);
//                        }
                         /*
                        倒計時,子線程給主線程發送消息 另一種寫法
                         */
                        handler.sendEmptyMessage(TIME_DESC);
                    }
                }).start();

            }
        });
        //主線程給子線程發送信息
        mButtonTochild= (Button) findViewById(R.id.button_tochild);
        mButtonTochild.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyThread thread=new MyThread();
                thread.start();
                //延遲,爲了給handlerTochild初始化的時間
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                thread.handlerTochild.sendEmptyMessage(0);
            }
        });
    }
    class MyThread extends Thread{
        private Handler handlerTochild;
        @Override
        public void run() {
            Looper.prepare();
            handlerTochild=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    Log.d("handleMessage ", "接收到了主線程發來的消息 ");
                }
            };
            Looper.loop();
        }
    }
}

AsyncTask(UI主線程)

//**activity_main.xml**
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">
    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar" />
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="開始下載"/>
</LinearLayout>

//**MainActivity**
public class MainActivity extends AppCompatActivity {
    private Button mButton;
    private ProgressBar mProgressBar;
    private int count=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mProgressBar= (ProgressBar) findViewById(R.id.progressBar);
        mButton= (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyTask myTask=new MyTask();
                myTask.execute("開始下載");
            }
        });
    }
    class MyTask extends AsyncTask<String,String,String>{
        /*
        開始
         */
        @Override
        protected String doInBackground(String... params) {
            while (count<101){
                count++;
                publishProgress(""+count);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "下載完成";
        }
        /*
        運行中
         */
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            int count=Integer.parseInt(values[0]);
            mProgressBar.setProgress(count);
        }
        /*
        結束
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mButton.setText(s);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章