AnsyncTask 非同期タスク
このセクションの概要:
このセクションで説明するのは、非同期タスクを処理するために Android によって提供される軽量クラスです: AsyncTask (通常、私たちはこのクラスを使用します) AsyncTaskを継承し、クラスに非同期操作を実装し、非同期実行の進行状況をUIメインスレッドにフィードバックします~ さて、いくつかの概念を理解していないかもしれませんが、マルチスレッドの概念を説明する必要があると思いますので、最初にいくつかの概念的なことを説明しましょう。
1. 関連概念
1) マルチスレッドとは:
答え: まず、アプリケーション、プロセス、スレッド、マルチスレッドという名前を理解する必要があります。 !
- アプリケーション: 特定のタスクを完了するために特定の言語で書かれた一連の命令 (静的コードのセット)
- プロセス (プロセス): 実行中のプログラム、システム スケジューリングリソース割り当ての独立した単位、オペレーティング システムが各プロセスを割り当てます メモリ空間のセクション、プログラムが動的に順次実行され、マネージャ コードがロードされ、実行プロセスが完了します。
- スレッド: プロセスよりも小さい実行単位。各プロセスには複数のスレッドが含まれる場合があります。 実行するには、1 つのプロセスにスレッドを配置する必要があります。 スレッドはプログラムによって管理されます! ! !プロセスはシステムによってスケジュールされています。 ! !
- マルチスレッド: 複数の命令を並行して実行し、スケジューリングアルゴリズムに従ってCPUのタイムスライスを各スレッドに割り当てます。実際にはタイムシェアリング実行ですが、この切り替え時間は非常に長くなります。ユーザーはそれが同時に行われていると感じます。
簡単な例: QQ を終了した後、突然音楽を聴きたいと思ったら、QQ をオフにしてから XX プレーヤーを起動する必要がありますか?答えは「いいえ」です。プレーヤーを直接開きましょう 曲を再生するだけで、QQ はまだ実行中ですよね?これは単純なマルチスレッドですね~ 実際の開発では、アプリケーションが動作している、などの例もあります。 新しいバージョンを見つけたので、バックグラウンドで更新したいと考えています。このとき、通常はバックグラウンド スレッドを開いて新しいバージョンの APK をダウンロードします。 アプリの他の機能も使用できます。マルチスレッドの使用例です~
2) 同期と非同期の概念:
答え: 同期: 特定の関数を実行すると、結果が得られるまで呼び出しを返すことはできません。簡単に言うと、こうでなければならないということです。 前の作業が完了するまで待ってから、次の作業を行ってください。簡単な例を挙げると、セックスをする場合、誰かを殺さないようにするには、まずコンドームを着用する必要があります。 それからまたセックスしますよね? コンドームを買って持って行ったら、この時点でセックスを始めることができます〜 鮮やかな例です♪(^∇^*)非同期: 特定の関数を実行するときに、同期を行います。すぐに結果は必要ありません。通常は結果が得られます 他の操作を行う場合、この関数は完了後に通知したりコールバックしたりすることができます。または、上記のバックグラウンド ダウンロードの例、バックグラウンド ダウンロード、 ダウンロード機能を実行した後は、ダウンロードプロセスを気にする必要はありません。ダウンロードが完了したら通知するだけで済みます~
3) Android はなぜ非同期タスクを導入するのでしょうか
プログラムが開始されると、対応するメインスレッド (Main Thread) が同時に開始され、このメインスレッドが主に処理を担当します。 UI関連のイベントも! UI スレッドと呼ばれることもあります。 Android アプリでは、このシングルスレッド モデルのルールに従う必要があります。 Android UI 操作はスレッドセーフではないため、これらの操作は UI スレッドで実行する必要があります。 メインスレッドの new Thread() など、非 UI スレッドにいる場合は、別のスレッドを開き、そのスレッド内の UI コントロールの値を直接変更します。 このとき、次の例外がスローされます: android.view.ViewRoot$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューに触れることができます さらに、時間のかかる操作をすべて配置すると、別のポイントがあります。 UI スレッド上 UI スレッドが 5 秒以上リクエストに応答しない場合、 このとき、ANR (Application Not Responding) 例外がトリガーされます。これは、アプリケーションが応答していないことを意味します~ 最後に、Android 4.0 以降では、UI スレッドでネットワーク操作を実行することは禁止されています。それ以外の場合は、次のメッセージが表示されます: android.os.NetworkOnMainThreadException
上記の理由はすべて、Android が非同期タスクを導入する重要性を示しています。もちろん、非同期タスクの実装もこのセクションで説明する必要はありません。 AsyncTask を使用すると、関連する操作を完了した後、次の 2 つの方法で UI を更新できます。
- 先ほど学習したハンドラーでは、UI の更新をハンドラーに記述し、sendMessage() などのメソッドを通じて UI に通知します。 更新はメインスレッドとサブスレッドに書いたHandlerの違いを忘れないように〜
- Activity.runOnUiThread(Runnable)を使ってRunnableにUIを更新するコードを作成します UIを更新するときはRunnableを入れます。 オブジェクトを渡すだけです~
2. AsyncTask の完全な分析:
1) AsyncTask を使用する理由
回答: 上記の 2 つの方法を使用して非同期操作を完了できます。非同期操作を追加するには、より多くの記述が必要になるか、より面倒になります。 new Thread() を作成してから、上記のメソッドを使用して UI に更新を通知する必要がありますか?プログラマーは怠け者になりがちです。 カプセル化された軽量の非同期クラスである AsyncTask を提供しています。これを使用してみてはいかがでしょうか?数十行のコードで実現できます 私たちの非同期操作は、ハンドラーと比較して進行状況を制御可能であり、AsyncTask はよりシンプルで高速です。もちろん、これは次の場合にのみ適しています。 単純な非同期操作。また、最も一般的に使用される非同期操作は、ネットワーク操作、画像の読み込み、データ送信などです。 当面は初心者のニーズを満たすことができますが、小規模なアプリケーションには感謝していますが、会社が実際にプロジェクトを実行した後は、サードパーティのアプリをさらに使用する予定です。 Volley、OkHttp、android-async-http、XUtils など、多くのフレームワークがあります。後ほど高度なチュートリアル用に 1 ~ 2 つのフレームワークを選択します。 学習は、もちろん自分で学習するための教材を見つけることもできますが、やはり AsyncTask をマスターする必要があります。
2) AsyncTask の基本構造
AsyncTask は抽象クラスです。通常、AsyncTask を継承するクラスを定義し、関連するメソッドをオーバーライドします。 公式API: AsyncTask
- AsyncTaskサブクラス構築用パラメータ:
- 関連メソッドと実行プロセス:
- メモ:
3. AsyncTask の使用例:
Android ネットワークについてはまだ学習していないため、ここではすべての初心者に配慮し、遅延を使用します。 ファイルのダウンロードのプロセスをシミュレートするスレッド~後でネットワークについて話すときにいくつかの例を書きます~
実装レンダリング:
レイアウトファイル: activity.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width=" match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MyActivity">
<TextView
android:id="@+id/txttitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 縦条を設置し、水平方向に設置します -->
<ProgressBar
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/pgbar"
style="?android:attr/progressBarStylehorizontal"/ >
<ボタン
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnupdate"
android:text="更新progressBar"/>
</LinearLayout>
ダウンロードをシミュレートするための遅延操作を定義します:
//ダウンロードをシミュレートするための遅延操作
public voidlay()
Thread.sleep(1000) ;
}catch (InterruptedException e){
e.printStackTrace();;
カスタマイズされた非同期タスク:
private TextView txt;
public MyAsyncTask(TextView txt,ProgressBar pgbar)
この.pgbar = pgbar;
//このメソッドは UI スレッドでは実行されず、主に非同期操作に使用されます。 {使用 - - - - - - - - - - - - - s sを使用して使用します。 UI コントロール
@Override
protected void onPreExecute() {
txt.setText("非同期スレッドの実行を開始します~"); }
// doBackground メソッドでは、publishProgress メソッドが呼び出されるたびにこのメソッドがトリガーされます
//UI スレッドで実行すると、UI コントロールを操作できます
@Override
protected void onProgressUpdate(Integer...values) {
int value = values[0];
pgbar.setProgress(value);
}
}
MainActivity.java:
private TextView txttitle;
プライベート ProgressBar pgbar;
プライベート ボタン btnupdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txttitle = (TextView)findViewById(R.id.txttitle);
pgbar = (ProgressBar)findViewById(R.id.pgbar);
btnupdate = (ボタン)findViewById(R.id.btnupdate);
btnupdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar);
myTask.execute(1000);
}
});
}
}
本节小结:
好、本节一开始给大家普及下应用程序、経程、線程、多線程、异步、同步の概念次に;また讲解 下の Android には、次の AsyncTask の使用法が組み込まれており、当然のことながら、ネットワーク上での操作が行われます。 操作用のものが多数あり、後ほどネットワーク操作時にこの AsyncTask に使用されます。感謝の意を表します~本节がここに到着します、谢谢~