Android Studio学習エッセイ-UIスレッドのブロックと最適化
3288 ワード
私たちが携帯電話を使用しているとき、よく問題に遭遇します.まずカードが死んでから、このプログラムから飛び出して応答しないかどうか、閉じるかどうかのヒント(もちろん私たちの携帯電話の性能が悪いかもしれません=.=)これはスレッドのブロックによるものです.ここでUIスレッドについて説明します.一般的なプロセッサはUIスレッドの中で時間のかかる操作を実行し、今回UIスレッドがブロックされ、UIスレッドがブロックされると、画面がカードが死んでしまいます.ユーザー体験が非常に悪くなり、スレッドのブロックが5 sを超えるとandroidシステムが介入する可能性があり、ポップアップダイアログボックスが閉じているかどうかを尋ねます.どうやって解決しますか?
ソリューション1:新しいスレッドを作成する
UIビューでbuttonとtextViewを作成しました
上のコードは私が新しいスレッドを作成して時間がかかりますが、実際の過程で行うことはできません.新しいスレッドに2つの言葉を追加しましょう.TextView=(TextView)v;view.setText(""+100);(現在のコントロールを取得し、文字を100に設定)このプログラムを試してみましょう.このとき、プログラムが間違っています.
実はグーグルには2つのアドバイスがありますが、ルールとも言えます
解決策1:view.post
上のコードが間違っているのは、UI以外のスレッドでUIコントロールを呼び出したためです.では、try{}catch(){}文の後にコードを追加します.
解決方法2:AsyncTask
AsyncTaskとpostの方法は大同小異である
外部でメソッドを作成し、buttonのonClickイベントで参照します.
ソリューション1:新しいスレッドを作成する
UIビューでbuttonとtextViewを作成しました
Button button=(Button)findViewById (R.id.button);
TextView textView=(TextView)findViewById(R.id.textView);
TranslateAnimation animation=new TranslateAnimation(0,200,0,0);
animation.setRepeatCount(3);
animation.setDuration(2000);
textView.setAnimation(animation);
// textView app
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {// button
new Thread(new Runnable() {//
@Override
public void run() {
try {
Thread.sleep(5000);//
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
});
上のコードは私が新しいスレッドを作成して時間がかかりますが、実際の過程で行うことはできません.新しいスレッドに2つの言葉を追加しましょう.TextView=(TextView)v;view.setText(""+100);(現在のコントロールを取得し、文字を100に設定)このプログラムを試してみましょう.このとき、プログラムが間違っています.
Only the original thread that created a view hierarchy can touch its views.
viewを作成したスレッドだけが修正できます.実はグーグルには2つのアドバイスがありますが、ルールとも言えます
there are simply two rules to Android's single thread model:
Do not block the Ui thread// UI
Do not access the Android UI toolkit from outside the UI thread// UI
では多くの人が疑問を持っていますが、これは矛盾ではありませんか?Googleもソリューションを提供してくれました解決策1:view.post
上のコードが間違っているのは、UI以外のスレッドでUIコントロールを呼び出したためです.では、try{}catch(){}文の後にコードを追加します.
1 v.post(new Runnable() {
2 @Override
3 public void run() {
4 TextView view=(TextView)v;
5 view.setText(""+sun);
6 }
7 });
このコードは私の文をUIスレッドに提出しました.でもねpostにもいくつかの欠点があります , ,
このため公式にも別の解決策が提供されています解決方法2:AsyncTask
AsyncTaskとpostの方法は大同小異である
private class DownloadImageTask extends AsyncTask{
protected Integer doInBackground(String...urls){
try{
Thread.sleep(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
int sun=100;
return sun;
}
protected void onPostExecute(Integer sum){
button2.setText(""+sum);
}
}
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadImageTask().execute();
}
});
外部でメソッドを作成し、buttonのonClickイベントで参照します.