Androidラーニングシリーズ-スレッドモデル
5356 ワード
スレッドモデル android UIスレッド child-process の使用方法
ANRエラー
単一スレッドによるANRエラー:ANRエラー(Application Not Responding)は、メインUIプロセスが5秒以上ブロックされて発生したエラーを指し、プログラムの正常な動作を終了します.ANRエラーの原因は、単一スレッドです.
に改心
このスレッドでUIを更新するとエラーも発生します
Androidスレッド間の通信——Handler
実は、Androidスレッド間の通信はHandlerだけでなく、Message,MessageQueue,Looperの相互使用も必要であり、Androidスレッド通信モデルは以下の通りである.
Thread ->[handler] -> Loop(message|> messageQueue) Message:伝達するメッセージ; MessageQueue:メッセージを格納するキュー; Looper:MessageQueueを作成し、その中のMessageを繰り返し使用します. Handler:メッセージの伝達に使用されます.
1、handler2、Activity.runOnUIThread(Runnable)3、View.Post(Runnable)4、View.PostDelayed(Runnabe,long)5、AsyncTask Thread , Runnable
AsyncTask
ANRエラー
単一スレッドによるANRエラー:ANRエラー(Application Not Responding)は、メインUIプロセスが5秒以上ブロックされて発生したエラーを指し、プログラムの正常な動作を終了します.ANRエラーの原因は、単一スレッドです.
public class MainActivity extends Activity {
private Button btn;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int count=0;
while(count<1000){
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
に改心
private Thread thread;
thread=new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(count<1000){
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(count);
}
}
});
thread.start();//
thread.stop();//
このスレッドでUIを更新するとエラーも発生します
Androidスレッド間の通信——Handler
実は、Androidスレッド間の通信はHandlerだけでなく、Message,MessageQueue,Looperの相互使用も必要であり、Androidスレッド通信モデルは以下の通りである.
Thread ->[handler] -> Loop(message|> messageQueue)
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button btn_start,btn_stop;
private TextView tv;
private int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_start=(Button) findViewById(R.id.button1);
btn_stop=(Button) findViewById(R.id.button2);
tv=(TextView) findViewById(R.id.textView1);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//
handler.post(runnable);
}
});
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//
handler.removeCallbacks(runnabl);
}
});
}
//
private Runnable runnable=new Runnable() {
@Override
public void run() {
i++;
// Message UI
Message m=new Message();
// Message arg1 arg2 int
m.arg1=i;
// Handler
handler.sendMessage(m);
}
};
@SuppressLint("HandlerLeak")
private Handler handler=new Handler(){
public void handleMessage(Message m){
System.out.println(m.arg1);
String str=m.arg1+"";
tv.setText(str);
handler.post(runnable);
}
};
}
1、handler2、Activity.runOnUIThread(Runnable)3、View.Post(Runnable)4、View.PostDelayed(Runnabe,long)5、AsyncTask
AsyncTask
//
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btn1,btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1=(Button) findViewById(R.id.button1);
btn2=(Button) findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// AsyncTask
new MyAsyncTask().execute();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("Hello To EveryOne");
}
});
}
}
//
import android.os.AsyncTask;
/**
* ,
* @author asus
*/
public class MyAsyncTask extends AsyncTask{
// ,
@Override
protected String doInVoid(params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}