Android/非同期処理/HandlerRunnable
提供: 初心者エンジニアの簡易メモ
AsyncTaskはAndroid11から非推奨となったので非同期処理はこちら推奨。
サンプル
final TextView textView = findViewById(R.id.text1);
final Handler handler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
final String msg = "background exec";
if (handler != null) {
handler.post(new Runnable() {
@Override
public void run() {
if (textView != null) {
textView.setText(msg);
}
}
});
}
}
}).start();
参考:https://qiita.com/8yabusa/items/f8c9bb7eb81175c49e97
サンプル(Runnableクラス切り分け)
MainActivity.java
final TextView textView = findViewById(R.id.text1); final Handler handler = new Handler(Looper.getMainLooper()); MyRunnableTask task = new MyRunnableTask(handler, textView); new Thread(task).start();
MyRunnableTask.java
import android.os.Handler;
import android.widget.TextView;
public class MyRunnableTask implements Runnable {
Handler mHandler;
TextView mTextView;
public MyRunnableTask(Handler handler, TextView textView) {
mHandler = handler;
mTextView = textView;
}
public void run() {
final String msg = "background exec";
if (mHandler != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
if (mTextView != null) {
mTextView.setText(msg);
}
}
});
}
}
}
サンプル(ネットワーク処理&View処理)
ネットワーク処理はマルチスレッドで処理して、ViewはUiスレッドで処理する。 AsyncTaskの代替になる。
- doInBackground()の処理はhandler.post(new Runnable() {public void run(){}の中へ
- onPostExecute()の処理はuiHandler.post(new Runnable() {public void run(){}の中へ
MainActivity.java
final TextView textView = findViewById(R.id.text1);
final Handler uiHandler = new Handler(Looper.getMainLooper());
HandlerThread thread = new HandlerThread("other");
thread.start();
final Handler handler = new Handler(thread.getLooper());
MyRunnableTask task = new MyRunnableTask(uiHandler, handler, textView);
new Thread(task).start();
MyRunnableTask.java
import android.os.Handler;
import android.widget.TextView;
public class MyRunnableTask implements Runnable {
Handler mUiHandler;
Handler mHandler;
TextView mTextView;
public MyRunnableTask(Handler uiHandler, Handler handler, TextView textView) {
mUiHandler = uiHandler;
mHandler = handler;
mTextView = textView;
}
public void run() {
final String ret = "";
if (mHandler != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
final CustomHttpURLConnection http = new CustomHttpURLConnection();
try {
String encode = URLEncoder.encode(param1, "UTF-8");
String url = "ttps://example.com/hoge?param1=" + encode;
http.execGet(url);
Log.i("http", http.getBody());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (mUiHandler != null) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
if (mTextView != null) {
mTextView.setText(ret);
}
}
});
}
}
});
}
}
}
callback処理
thread処理後に元処理を呼び出す。
MainActivity.java
final TextView textView = findViewById(R.id.text1);
final Handler uiHandler = new Handler(Looper.getMainLooper());
MyRunnableTask task = new MyRunnableTask(uiHandler, textView);
MyRunnableTask.CallbackInterface callback = new MyRunnableTask.CallbackInterface() {
@Override
public void callback() {
Log.i("test", "callback");
}
};
task.ThreadWithCallback(callback);
new Thread(task).start();
MyRunnableTask.java
public class MyRunnableTask implements Runnable {
Handler mUiHandler;
TextView mTextView;
CallbackInterface mCallback;
interface CallbackInterface {
void callback();
}
public MyRunnableTask(Handler handler, TextView textView) {
mUiHandler = handler;
mTextView = textView;
}
void ThreadWithCallback(CallbackInterface callback) {
mCallback = callback;
}
public void run() {
final String msg = "update text string";
if (mUiHandler != null) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
if (mTextView != null) {
mTextView.setText(msg);
}
}
});
}
mCallback.callback();
}
}
