當前位置:首頁 » 安卓系統 » android線程定時

android線程定時

發布時間: 2022-04-22 17:34:50

⑴ android,下面的線程不想點擊後才執行,想每隔10s自動執行一次,該怎麼寫代碼啊

java">Timertimer=newTimer();
timer.schele(newTimerTask(){

@Override
publicvoidrun(){
send();
Messagem=handler.obtainMessage();
handler.sendMessage(m);
}
},1000,10000);

⑵ android中如何使用線程

線程類和Runnable是延續了java 的風格,但由於android對線程安全的考慮,在sdk中加入了handler類,在其它線程與主線程交互的時候,該類可以通過發送消息管理線程,或者直接post()某個runnable,對runnable進行管理。具體內容,請查api。

⑶ android 中兩個線程同時運行,第一個線程每隔一分鍾運行一次,第二個線程每隔半分鍾運行一次如何實現

偽碼:
uint oldTime = getCurrentTime();
bool continueRunnint = true;
while( continueRunning ) {

while(true) {
currentTime = getCurrentTime();
if (currentTime - oldTime > 60sec) break;
oldTime = currentTime;
sleep(1 second);
}

runningYourCodeHere();
if (yourDone) continueRunning = false;
}

⑷ 能主動讓android主線程等待1s嗎

對於Android apk的主線程,原則上是不能等的,雖然確實可以堵塞主線程1s。讓主線程等待1s,就意味著程序無響應1s, 無響應時間過長,系統是會彈對話框來殺掉程序的。

⑸ android中開線程延時問題

我想做到的效果是屏幕中畫一個圓,然後圓會慢慢變小,當半徑變成1時停止變小。然後每觸摸一次屏幕圓半徑會增大,直到半徑到100停止。我把這兩個寫在了兩個線程里,但是目前運行下來觸摸屏放大圓可以,但是圓自己慢慢變小卻不行。

MainActivity.java 重要 代碼

public class MainActivity extends Activity{

private Thread thread1;
private Thread thread2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FrameLayout frame=new FrameLayout(this);
setContentView(frame);
frame.findViewById(R.id.framelayout1);
final MyView view=new MyView(this);

thread1=new Thread(new Runnable(){
@Override
public void run(){
view.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v,MotionEvent event){
++view.r;
view.invalidate();
return true;
}
});
}
});

thread2=new Thread(new Runnable(){
@Override
public void run(){
--view.r;
view.invalidate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});

thread1.start();
thread2.start();
frame.addView(view);
if (view.r==1)
{
thread2.interrupt();
}
if (view.r==100){
thread1.interrupt();
}
}

}

class MyView extends View{
int r=10,x,y;
public MyView(Context context){
super(context);
x=context.getResources().getDisplayMetrics().widthPixels/2;
y=context.getResources().getDisplayMetrics().heightPixels/2;
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(3);
paint.setStyle(Style.STROKE);
paint.setColor(Color.BLUE);
canvas.drawCircle(x,y,r,paint);
}
}

⑹ android中的線程池 怎麼用

Java的線程池對Android也是適用的
線程池的作用:
線程池作用就是限制系統中執行線程的數量。
根據系統的環境情況,可以自動或手動設置線程數量,達到運行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程
排隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務需要運行時,如果線程
池中有等待的工作線程,就可以開始運行了;否則進入等待隊列。
為什麼要用線程池:
1.減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,可執行多個任務。
2.可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的內存,而把伺服器累趴下(每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大,最後死機)。

Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。
newScheledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

1.newCachedThreadPool

/**
* 可以緩存線程池
*/
public static void Function1() {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 50; i++) {
final int index = i;
try {
Thread.sleep(100); // 休眠時間越短創建的線程數越多
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executorService.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("active count = " + Thread.activeCount()
+ " index = " + index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

列印結果
active count = 2 index = 0
active count = 3 index = 1
active count = 4 index = 2
active count = 5 index = 3
active count = 6 index = 4
active count = 7 index = 5
active count = 8 index = 6
active count = 9 index = 7
active count = 10 index = 8
active count = 11 index = 9
active count = 11 index = 10
active count = 11 index = 11
active count = 11 index = 12
active count = 11 index = 13
active count = 11 index = 14
active count = 11 index = 15
active count = 11 index = 16
active count = 11 index = 17
active count = 11 index = 18
active count = 11 index = 19
active count = 11 index = 20
active count = 11 index = 21
active count = 11 index = 22
active count = 11 index = 23
active count = 11 index = 24
active count = 11 index = 25
active count = 11 index = 26
active count = 11 index = 27
active count = 11 index = 28
active count = 11 index = 29
active count = 11 index = 30
active count = 11 index = 31
active count = 11 index = 32
active count = 11 index = 33
active count = 11 index = 34
active count = 11 index = 35
active count = 11 index = 36
active count = 11 index = 37
active count = 11 index = 38
active count = 11 index = 39
active count = 11 index = 40
active count = 11 index = 41
active count = 11 index = 42
active count = 11 index = 43
active count = 11 index = 44
active count = 11 index = 45
active count = 11 index = 46
active count = 11 index = 47
active count = 11 index = 48
active count = 10 index = 49
從列印消息來看開始線程數在增加,後來穩定,可以修改休眠時間,休眠時間越短創建的線程數就越多,因為前面的還沒執行完,線程池中沒有可以執行的就需要創建;如果把休眠時間加大,創建的線程數就會少

2.newFixedThreadPool 根據傳入的參數創建線程數目
/**
* 定長線程池
*/
public static void Function2() {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 30; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("index = " + index
+ " thread count = " + Thread.activeCount());
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

3.newScheledThreadPool
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

/**
* 定長線程池,可做延時
*/
public static void Function3() {
ScheledExecutorService executorService = Executors
.newScheledThreadPool(5);
executorService.schele(new Runnable() {

@Override
public void run() {
System.out.println("delay 3 seconds" + " thread count = "
+ Thread.activeCount());
}
}, 3, TimeUnit.SECONDS);
}

/**
* 定期執行,可以用來做定時器
*/
public static void Function4() {
ScheledExecutorService executorService = Executors
.newScheledThreadPool(3);
executorService.scheleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out
.println("delay 1 seconds, and excute every 3 seconds"
+ " thread count = " + Thread.activeCount());
}
}, 1, 3, TimeUnit.SECONDS);
}
列印結果
?

1
2
3
4
5
6
7
8
9

delay 1 seconds, and excute every 3 seconds thread count = 2
delay 1 seconds, and excute every 3 seconds thread count = 3
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4

4.newSingleThreadExecutor這個最簡單
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/**
* 單例線程
*/
public static void Function5() {
ExecutorService singleThreadExecutor = Executors
.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {

@Override
public void run() {
try {
System.out.println("index = " + index
+ " thread count = " + Thread.activeCount());
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

列印結果:
?

1
2
3
4
5

index = 0 thread count = 2
index = 1 thread count = 2
index = 2 thread count = 2
index = 3 thread count = 2
index = 4 thread count = 2

⑺ android 上傳文件需要非同步線程嗎

一、handler的引入:

我們都知道,Android UI是線程不安全的,如果在子線程中嘗試進行UI操作,程序就有可能會崩潰。相信大家在日常的工作當中都會經常遇到這個問題,解決的方案應該也是早已爛熟於心,即創建一個Message對象,然後藉助Handler發送出去,之後在Handler的handleMessage()方法中獲得剛才發送的Message對象,然後在這里進行UI操作就不會再出現崩潰了。具體實現代碼如下:

復制代碼
1 package com.example.androidthreadtest;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.widget.Button;
10 import android.widget.TextView;
11
12 public class MainActivity extends Activity implements OnClickListener {
13
14 public static final int UPDATE_TEXT = 1;
15 private TextView text;
16 private Button changeText;
17 private Handler handler = new Handler() {
18 public void handleMessage(Message msg) {
19 switch (msg.what) {
20 case UPDATE_TEXT:
21 text.setText("Nice to meet you");
22 break;
23 default:
24 break;
25 }
26 }
27 };
28
29 @Override
30 protected void onCreate(Bundle savedInstanceState) {
31 super.onCreate(savedInstanceState);
32 setContentView(R.layout.activity_main);
33 text = (TextView) findViewById(R.id.text);
34 changeText = (Button) findViewById(R.id.change_text);
35 changeText.setOnClickListener(this);
36 }
37
38 @Override
39 public void onClick(View v) {
40 switch (v.getId()) {
41 case R.id.change_text:
42 new Thread(new Runnable() {
43 @Override
44 public void run() {
45 Message message = new Message();
46 message.what = UPDATE_TEXT;
47 handler.sendMessage(message);
48 }
49 }).start();
50 break;
51 default:
52 break;
53 }
54 }
55 }
復制代碼
上方第45行代碼也可以換成:

Message msg = handler.obtainMessage();
上面的代碼中,我們並沒有在子線程中直接進行UI操作,而是創建了一個Message對象,並將它的what欄位的值指定為了一個整形常量UPDATE_TEXT,用於表示更新TextView這個動作。然後調用Handler的sendMessage()方法將這條Message發送出去。很快,Handler就會收到這條Message,並在handleMessage()方法,在這里對具體的Message進行處理(需要注意的是,此時handleMessage()方法中的代碼是在主線程中運行的)。如果發現Message的what欄位的值等於UPDATE_TEXT,就將TextView顯示的內容更新。運行程序後,點擊按鈕,TextView就會顯示出更新的內容。

二、非同步消息處理機制:

Handler是Android類庫提供的用於接受、傳遞和處理消息或Runnable對象的處理類,它結合Message、MessageQueue和Looper類以及當前線程實現了一個消息循環機制,用於實現任務的非同步載入和處理。整個非同步消息處理流程的示意圖如下圖所示:

根據上面的圖片,我們現在來解析一下非同步消息處理機制:

Message:消息體,用於裝載需要發送的對象。
handler:它直接繼承自Object。作用是:在子線程中發送Message或者Runnable對象到MessageQueue中;在UI線程中接收、處理從MessageQueue分發出來的Message或者Runnable對象。發送消息一般使用Handler的sendMessage()方法,而發出去的消息經過處理後最終會傳遞到Handler的handlerMessage()方法中。
MessageQueue:用於存放Message或Runnable對象的消息隊列。它由對應的Looper對象創建,並由Looper對象管理。每個線程中都只會有一個MessageQueue對象。
Looper:是每個線程中的MessageQueue的管家,循環不斷地管理MessageQueue接收和分發Message或Runnable的工作。調用Looper的loop()方法後,就會進入到一個無限循環中然後每當發現MessageQueue中存在一條消息,就會將它取出,並調用Handler的handlerMessage()方法。每個線程中也只會有一個Looper對象。
了解這些之後,我們在來看一下他們之間的聯系:

首先要明白的是,Handler和Looper對象是屬於線程內部的數據,不過也提供與外部線程的訪問介面,Handler就是公開給外部線程的介面,用於線程間的通信。Looper是由系統支持的用於創建和管理MessageQueue的依附於一個線程的循環處理對象,而Handler是用於操作線程內部的消息隊列的,所以Handler也必須依附一個線程,而且只能是一個線程。

我們再來對非同步消息處理的整個流程梳理一遍:

當應用程序開啟時,系統會自動為UI線程創建一個MessageQueue(消息隊列)和Looper循環處理對象。首先需要在主線程中創建一個Handler對象,並重寫handlerMessage()方法。然後當子線程中需要進行UI操作時,就創建一個Message對象,並通過Handler將這條消息發送出去。之後這條消息就會被添加到MessageQueue的隊列中等待被處理,而Looper則會一直嘗試從MessageQueue中取出待處理消息,並找到與消息對象對應的Handler對象,然後調用Handler的handleMessage()方法。由於Handler是在主線程中創建的,所以此時handleMessage()方法中的代碼也會在主線程中運行,於是我們在這里就可以安心地進行UI操作了。

通俗地來講,一般我們在實際的開發過程中用的比較多一種情況的就是主線程的Handler將子線程中處理過的耗時操作的結果封裝成Message(消息),並將該Message(利用主線程里的MessageQueue和Looper)傳遞到主線程中,最後主線程再根據傳遞過來的結果進行相關的UI元素的更新,從而實現任務的非同步載入和處理,並達到線程間的通信。

通過上一小節對Handler的一個初步認識後,我們可以很容易總結出Handler的主要用途,下面是Android官網總結的關於Handler類的兩個主要用途:

(1)線程間的通信:

在執行較為耗時的操作時,Handler負責將子線程中執行的操作的結果傳遞到UI線程,然後UI線程再根據傳遞過來的結果進行相關UI元素的更新。(上面已有說明)

(2)執行定時任務:

指定任務時間,在某個具體時間或某個時間段後執行特定的任務操作,例如使用Handler提供的postDelayed(Runnable r,long delayMillis)方法指定在多久後執行某項操作,比如當當、淘寶、京東和微信等手機客戶端的開啟界面功能,都是通過Handler定時任務來完成的。

我們接下來講一下post。

三、post:

對於Handler的Post方式來說,它會傳遞一個Runnable對象到消息隊列中,在這個Runnable對象中,重寫run()方法。一般在這個run()方法中寫入需要在UI線程上的操作。

Post允許把一個Runnable對象入隊到消息隊列中。它的方法有:post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)。詳細解釋如下:

boolean post(Runnable r):把一個Runnable入隊到消息隊列中,UI線程從消息隊列中取出這個對象後,立即執行。
boolean postAtTime(Runnable r,long uptimeMillis):把一個Runnable入隊到消息隊列中,UI線程從消息隊列中取出這個對象後,在特定的時間執行。
boolean postDelayed(Runnable r,long delayMillis):把一個Runnable入隊到消息隊列中,UI線程從消息隊列中取出這個對象後,延遲delayMills秒執行
void removeCallbacks(Runnable r):從消息隊列中移除一個Runnable對象。
下面通過一個Demo,講解如何通過Handler的post方式在新啟動的線程中修改UI組件的屬性:

復制代碼
1 package com.example.m03_threadtest01;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.TextView;
9
10 public class MainActivity extends Activity {
11 private Button btnMes1,btnMes2;
12 private TextView tvMessage;
13 // 聲明一個Handler對象
14 private static Handler handler=new Handler();
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.activity_main);
20
21 btnMes1=(Button)findViewById(R.id.button1);
22 btnMes2=(Button)findViewById(R.id.button2);
23 tvMessage=(TextView)findViewById(R.id.TextView1);
24 btnMes1.setOnClickListener(new View.OnClickListener() {
25
26 @Override
27 public void onClick(View v) {
28 // 新啟動一個子線程
29 new Thread(new Runnable() {
30 @Override
31 public void run() {
32 // tvMessage.setText("...");
33 // 以上操作會報錯,無法再子線程中訪問UI組件,UI組件的屬性必須在UI線程中訪問
34 // 使用post方式修改UI組件tvMessage的Text屬性
35 handler.post(new Runnable() {
36 @Override
37 public void run() {
38 tvMessage.setText("使用Handler.post在工作線程中發送一段執行到消息隊列中,在主線程中執行。");
39 }
40 });
41 }
42 }).start();
43 }
44 });
45
46 btnMes2.setOnClickListener(new View.OnClickListener() {
47
48 @Override
49 public void onClick(View v) {
50 new Thread(new Runnable() {
51 @Override
52 public void run() {
53 // 使用postDelayed方式修改UI組件tvMessage的Text屬性值
54 // 並且延遲3S執行
55 handler.postDelayed(new Runnable() {
56
57 @Override
58 public void run() {
59 tvMessage.setText("使用Handler.postDelayed在工作線程中發送一段執行到消息隊列中,在主線程中延遲3S執行。");
60
61 }
62 }, 3000);
63 }
64 }).start();
65
66 }
67 });
68 }
69
70 }
復制代碼
點擊按鈕,運行結果如下:

有一點值得注意的是,對於Post方式而言,它其中Runnable對象的run()方法的代碼,均執行在UI線程上(雖然是寫在子線程當中的),所以對於這段代碼而言,不能執行在UI線程上的操作,一樣無法使用post方式執行,比如說訪問網路。

四、Message:

Handler如果使用sendMessage的方式把消息入隊到消息隊列中,需要傳遞一個Message對象,而在Handler中,需要重寫handleMessage()方法,用於獲取工作線程傳遞過來的消息,此方法運行在UI線程上。

對於Message對象,一般並不推薦直接使用它的構造方法得到,而是建議通過使用Message.obtain()這個靜態的方法或者Handler.obtainMessage()獲取。Message.obtain()會從消息池中獲取一個Message對象,如果消息池中是空的,才會使用構造方法實例化一個新Message,這樣有利於消息資源的利用。並不需要擔心消息池中的消息過多,它是有上限的,上限為10個。Handler.obtainMessage()具有多個重載方法,如果查看源碼,會發現其實Handler.obtainMessage()在內部也是調用的Message.obtain()。

Handler中,與Message發送消息相關的方法有:

Message obtainMessage():獲取一個Message對象。
boolean sendMessage():發送一個Message對象到消息隊列中,並在UI線程取到消息後,立即執行。
boolean sendMessageDelayed():發送一個Message對象到消息隊列中,在UI線程取到消息後,延遲執行。
boolean sendEmptyMessage(int what):發送一個空的Message對象到隊列中,並在UI線程取到消息後,立即執行。
boolean sendEmptyMessageDelayed(int what,long delayMillis):發送一個空Message對象到消息隊列中,在UI線程取到消息後,延遲執行。
void removeMessage():從消息隊列中移除一個未響應的消息。

⑻ android 能不能在主線程定時操作

先給你提示一下。android中更新UI只能用UI線程,即主線程。 這樣說吧 ui線程== 主線程。 1 想要在子線程中數據發生改變更新主線程的ui,可以通過消息機制,message和handler結合的方式,比較好用。 2 還可以 用特定的控制項的方法,比如ListView的adapter中的notifydatachang().好像是這個方法 3 在view中還可以在數據變化後用invalidata()或者postInvalidata()這兩個方法。 基本上就這幾種常見的,希望可以幫你,大家都來討論。

⑼ android 線程 實現2000毫秒後a.a()然後每10毫秒a.b++直至a.b==250

你好,一個簡單的思路,先使用handler啟用一個線程,2000毫秒後執行a(),a()方法最後開啟一個Timer定時器,每隔10毫秒發送一個消息message,在handler中處理b++,直到在handler中b為250後,清楚定時器就可以了
希望可以幫助到你

熱點內容
phpnow解壓版 發布:2025-05-16 02:52:49 瀏覽:810
dmporacle資料庫 發布:2025-05-16 02:44:31 瀏覽:831
雲主機上傳 發布:2025-05-16 02:44:30 瀏覽:82
滑鼠如何編程 發布:2025-05-16 02:29:09 瀏覽:816
安卓70能用什麼軟體 發布:2025-05-16 01:45:09 瀏覽:481
編程發展史 發布:2025-05-16 01:38:52 瀏覽:529
android圖片氣泡 發布:2025-05-16 01:38:40 瀏覽:887
文件加密編輯器下載 發布:2025-05-16 01:30:41 瀏覽:344
linuxapacheyum安裝 發布:2025-05-16 01:30:31 瀏覽:477
大連賓利浴池wifi密碼是多少 發布:2025-05-16 01:25:36 瀏覽:172