「Android/カスタムListener」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==独自Listenerを作る方法== 足し算処理を例にする -CustomData.java public class CustomData { public int code; public String message; public C...」) |
(→privateクラスに定義したlistenerを使う) |
||
(同じ利用者による、間の9版が非表示) | |||
行98: | 行98: | ||
test: onFinish() | test: onFinish() | ||
test: onClose() | test: onClose() | ||
+ | |||
+ | ==Listenerをメインスレッドで処理しない場合== | ||
+ | -MainActivityの以下を書き換える | ||
+ | - CustomTask task = new CustomTask(); | ||
+ | + CustomTask task = new CustomTask(this); | ||
+ | |||
+ | -CustomTask.java | ||
+ | public class CustomTask { | ||
+ | private Activity mActivity; | ||
+ | private CustomListener mListener; | ||
+ | private CustomData data; | ||
+ | CustomTask(Activity activity) { | ||
+ | mActivity = activity; | ||
+ | data = new CustomData(123, "hello"); | ||
+ | } | ||
+ | public void exec(int num, int addnum, int sum) { | ||
+ | this.mActivity.runOnUiThread(new Runnable() { | ||
+ | public void run() { | ||
+ | if (mListener != null) { | ||
+ | mListener.onLoad(data); | ||
+ | mListener.onStart(data); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | if (num + addnum == sum) { | ||
+ | data.message = "success " + num + "+" + addnum + "=" + sum; | ||
+ | this.mActivity.runOnUiThread(new Runnable() { | ||
+ | public void run() { | ||
+ | if (mListener != null) { | ||
+ | mListener.onSuccess(data); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } else { | ||
+ | data.message = "error " + num + "+" + addnum + "!=" + sum; | ||
+ | this.mActivity.runOnUiThread(new Runnable() { | ||
+ | public void run() { | ||
+ | if (mListener != null) { | ||
+ | mListener.onError(data); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | this.mActivity.runOnUiThread(new Runnable() { | ||
+ | public void run() { | ||
+ | if (mListener != null) { | ||
+ | mListener.onFinish(data); | ||
+ | mListener.onClose(data); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | public void setCustomListener(CustomListener listener) { | ||
+ | mListener = listener; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ==privateクラスに定義したlistenerを使う== | ||
+ | privateクラスにlistenerを定義して使うこともできる | ||
+ | public class MainActivity extends AppCompatActivity { | ||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | super.onCreate(savedInstanceState); | ||
+ | setContentView(R.layout.activity_main); | ||
+ | CustomListener listener = new Custom2Listener(); // ここの部分 | ||
+ | CustomTask task = new CustomTask(); | ||
+ | task.setCustomListener(listener); | ||
+ | task.exec(1, 1, 2); | ||
+ | task.exec(1, 1, 3); | ||
+ | } | ||
+ | private class Custom2Listener implements CustomListener { | ||
+ | @Override | ||
+ | public void onLoad(CustomData data) { | ||
+ | Log.i("test", "task onLoad()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onStart(CustomData data) { | ||
+ | Log.i("test", "task onStart()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onSuccess(CustomData data) { | ||
+ | Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onError(CustomData data) { | ||
+ | Log.i("test", "task onError() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onFinish(CustomData data) { | ||
+ | Log.i("test", "task onFinish()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onClose(CustomData data) { | ||
+ | Log.i("test", "task onClose()"); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ==privateクラスに定義したlistenerを継承したlistenerを使う== | ||
+ | privateクラスにlistenerを定義して使うこともできる | ||
+ | public class MainActivity extends AppCompatActivity { | ||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | super.onCreate(savedInstanceState); | ||
+ | setContentView(R.layout.activity_main); | ||
+ | CustomListener listener = new Custom2Listener(); | ||
+ | CustomListener listener3 = new Custom3Listener(); // ここの部分 | ||
+ | CustomTask task = new CustomTask(); | ||
+ | task.setCustomListener(listener); | ||
+ | task.setCustomListener(listener3); | ||
+ | task.exec(1, 1, 2); | ||
+ | task.exec(1, 1, 3); | ||
+ | } | ||
+ | private class Custom2Listener implements CustomListener { | ||
+ | @Override | ||
+ | public void onLoad(CustomData data) { | ||
+ | Log.i("test", "task onLoad()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onStart(CustomData data) { | ||
+ | Log.i("test", "task onStart()"); | ||
+ | } | ||
+ | // 略 | ||
+ | } | ||
+ | private class Custom3Listener implements Custom2Listener { | ||
+ | @Override | ||
+ | public void onLoad(CustomData data) { | ||
+ | Log.i("test", "task3 onLoad()"); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ==privateプロパティに定義したlistenerを使う== | ||
+ | privateプロパティにlistenerを定義して使うこともできる | ||
+ | public class MainActivity extends AppCompatActivity { | ||
+ | private CustomListener mListener = new CustomListener() { | ||
+ | @Override | ||
+ | public void onLoad(CustomData data) { | ||
+ | Log.i("test", "task onLoad()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onStart(CustomData data) { | ||
+ | Log.i("test", "task onStart()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onSuccess(CustomData data) { | ||
+ | Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onError(CustomData data) { | ||
+ | Log.i("test", "task onError() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onFinish(CustomData data) { | ||
+ | Log.i("test", "task onFinish()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onClose(CustomData data) { | ||
+ | Log.i("test", "task onClose()"); | ||
+ | } | ||
+ | }; | ||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | super.onCreate(savedInstanceState); | ||
+ | setContentView(R.layout.activity_main); | ||
+ | CustomTask task = new CustomTask(); | ||
+ | task.setCustomListener(mListener); | ||
+ | task.exec(1, 1, 2); | ||
+ | task.exec(1, 1, 3); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | ==別のクラスにListenerを追加する== | ||
+ | 別のクラスにListenerを定義して使うこともできる | ||
+ | public class MainActivity extends AppCompatActivity { | ||
+ | private CustomView.SampleListener mListener = new CustomView.SampleListener() { | ||
+ | @Override | ||
+ | public void onLoad(CustomData data) { | ||
+ | Log.i("test", "task onLoad()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onStart(CustomData data) { | ||
+ | Log.i("test", "task onStart()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onSuccess(CustomData data) { | ||
+ | Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onError(CustomData data) { | ||
+ | Log.i("test", "task onError() code=" + data.code + " " + data.message); | ||
+ | } | ||
+ | @Override | ||
+ | public void onFinish(CustomData data) { | ||
+ | Log.i("test", "task onFinish()"); | ||
+ | } | ||
+ | @Override | ||
+ | public void onClose(CustomData data) { | ||
+ | Log.i("test", "task onClose()"); | ||
+ | } | ||
+ | }; | ||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | super.onCreate(savedInstanceState); | ||
+ | setContentView(R.layout.activity_main); | ||
+ | CustomTask task = new CustomTask(); | ||
+ | task.setCustomListener(mListener); | ||
+ | task.exec(1, 1, 2); | ||
+ | task.exec(1, 1, 3); | ||
+ | } | ||
+ | } | ||
+ | SampleView.java | ||
+ | public class SampleView extends View { | ||
+ | public static abstract interface SampleListener | ||
+ | { | ||
+ | public abstract void onLoad(CustomData data); | ||
+ | public abstract void onStart(CustomData data); | ||
+ | public abstract void onSuccess(CustomData data); | ||
+ | public abstract void onError(CustomData data); | ||
+ | public abstract void onFinish(CustomData data); | ||
+ | public abstract void onClose(CustomData data); | ||
+ | } | ||
+ | |||
+ | ==ListenerをinterfaceでなくabstractClassで作る== | ||
+ | <pre> | ||
+ | public abstract class CustomListener { | ||
+ | public abstract void onLoad(Custom data); | ||
+ | public abstract void onError(Exception e){}; | ||
+ | } | ||
+ | </pre> | ||
+ | option指定したい場合onErrorの引数有りとなしどちらでも良い | ||
+ | <pre> | ||
+ | public abstract class CustomListener { | ||
+ | public abstract void onLoad(Custom data); | ||
+ | public void onError(Exception e){}; | ||
+ | @Deprecated | ||
+ | public void onError() {} | ||
+ | } | ||
+ | </pre> |
2019年4月26日 (金) 13:04時点における最新版
目次
独自Listenerを作る方法
足し算処理を例にする
-CustomData.java
public class CustomData { public int code; public String message; public CustomData(int code, String message) { this.code = code; this.message = message; } }
-CustomListener.java
public interface CustomListener { void onLoad(CustomData data); void onStart(CustomData data); void onSuccess(CustomData data); void onError(CustomData data); void onFinish(CustomData data); void onClose(CustomData data); }
-CustomTask.java
public class CustomTask { private CustomListener mListener; private CustomData data; CustomTask() { data = new CustomData(123, "hello"); } public void exec(int num, int addnum, int sum) { mListener.onLoad(data); mListener.onStart(data); if (num + addnum == sum) { data.message = "success " + num + "+" + addnum + "=" + sum; mListener.onSuccess(data); } else { data.message = "error " + num + "+" + addnum + "!=" + sum; mListener.onError(data); } mListener.onFinish(data); mListener.onClose(data); } public void setCustomListener(CustomListener listener) { mListener = listener; } }
-メイン処理(MainActivity.java)
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomListener listener = new CustomListener() { @Override public void onLoad(CustomData data) { Log.i("test", "task onLoad()"); } @Override public void onStart(CustomData data) { Log.i("test", "task onStart()"); } @Override public void onSuccess(CustomData data) { Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); } @Override public void onError(CustomData data) { Log.i("test", "task onError() code=" + data.code + " " + data.message); } @Override public void onFinish(CustomData data) { Log.i("test", "task onFinish()"); } @Override public void onClose(CustomData data) { Log.i("test", "task onClose()"); } }; CustomTask task = new CustomTask(); task.setCustomListener(listener); task.exec(1, 1, 2); // 処理1 task.exec(1, 1, 3); // 処理2 } }
処理1
test: onLoad() test: onStart() test: onSuccess() code=123 success 1+1=2 test: onFinish() test: onClose()
処理2
test: onLoad() test: onStart() test: onError() code=123 error 1+1!=3 test: onFinish() test: onClose()
Listenerをメインスレッドで処理しない場合
-MainActivityの以下を書き換える
- CustomTask task = new CustomTask(); + CustomTask task = new CustomTask(this);
-CustomTask.java
public class CustomTask { private Activity mActivity; private CustomListener mListener; private CustomData data; CustomTask(Activity activity) { mActivity = activity; data = new CustomData(123, "hello"); } public void exec(int num, int addnum, int sum) { this.mActivity.runOnUiThread(new Runnable() { public void run() { if (mListener != null) { mListener.onLoad(data); mListener.onStart(data); } } }); if (num + addnum == sum) { data.message = "success " + num + "+" + addnum + "=" + sum; this.mActivity.runOnUiThread(new Runnable() { public void run() { if (mListener != null) { mListener.onSuccess(data); } } }); } else { data.message = "error " + num + "+" + addnum + "!=" + sum; this.mActivity.runOnUiThread(new Runnable() { public void run() { if (mListener != null) { mListener.onError(data); } } }); } this.mActivity.runOnUiThread(new Runnable() { public void run() { if (mListener != null) { mListener.onFinish(data); mListener.onClose(data); } } }); } public void setCustomListener(CustomListener listener) { mListener = listener; } }
privateクラスに定義したlistenerを使う
privateクラスにlistenerを定義して使うこともできる
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomListener listener = new Custom2Listener(); // ここの部分 CustomTask task = new CustomTask(); task.setCustomListener(listener); task.exec(1, 1, 2); task.exec(1, 1, 3); } private class Custom2Listener implements CustomListener { @Override public void onLoad(CustomData data) { Log.i("test", "task onLoad()"); } @Override public void onStart(CustomData data) { Log.i("test", "task onStart()"); } @Override public void onSuccess(CustomData data) { Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); } @Override public void onError(CustomData data) { Log.i("test", "task onError() code=" + data.code + " " + data.message); } @Override public void onFinish(CustomData data) { Log.i("test", "task onFinish()"); } @Override public void onClose(CustomData data) { Log.i("test", "task onClose()"); } } }
privateクラスに定義したlistenerを継承したlistenerを使う
privateクラスにlistenerを定義して使うこともできる
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomListener listener = new Custom2Listener(); CustomListener listener3 = new Custom3Listener(); // ここの部分 CustomTask task = new CustomTask(); task.setCustomListener(listener); task.setCustomListener(listener3); task.exec(1, 1, 2); task.exec(1, 1, 3); } private class Custom2Listener implements CustomListener { @Override public void onLoad(CustomData data) { Log.i("test", "task onLoad()"); } @Override public void onStart(CustomData data) { Log.i("test", "task onStart()"); } // 略 } private class Custom3Listener implements Custom2Listener { @Override public void onLoad(CustomData data) { Log.i("test", "task3 onLoad()"); } } }
privateプロパティに定義したlistenerを使う
privateプロパティにlistenerを定義して使うこともできる
public class MainActivity extends AppCompatActivity { private CustomListener mListener = new CustomListener() { @Override public void onLoad(CustomData data) { Log.i("test", "task onLoad()"); } @Override public void onStart(CustomData data) { Log.i("test", "task onStart()"); } @Override public void onSuccess(CustomData data) { Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); } @Override public void onError(CustomData data) { Log.i("test", "task onError() code=" + data.code + " " + data.message); } @Override public void onFinish(CustomData data) { Log.i("test", "task onFinish()"); } @Override public void onClose(CustomData data) { Log.i("test", "task onClose()"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomTask task = new CustomTask(); task.setCustomListener(mListener); task.exec(1, 1, 2); task.exec(1, 1, 3); } }
別のクラスにListenerを追加する
別のクラスにListenerを定義して使うこともできる
public class MainActivity extends AppCompatActivity { private CustomView.SampleListener mListener = new CustomView.SampleListener() { @Override public void onLoad(CustomData data) { Log.i("test", "task onLoad()"); } @Override public void onStart(CustomData data) { Log.i("test", "task onStart()"); } @Override public void onSuccess(CustomData data) { Log.i("test", "task onSuccess() code=" + data.code + " " + data.message); } @Override public void onError(CustomData data) { Log.i("test", "task onError() code=" + data.code + " " + data.message); } @Override public void onFinish(CustomData data) { Log.i("test", "task onFinish()"); } @Override public void onClose(CustomData data) { Log.i("test", "task onClose()"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomTask task = new CustomTask(); task.setCustomListener(mListener); task.exec(1, 1, 2); task.exec(1, 1, 3); } }
SampleView.java
public class SampleView extends View { public static abstract interface SampleListener { public abstract void onLoad(CustomData data); public abstract void onStart(CustomData data); public abstract void onSuccess(CustomData data); public abstract void onError(CustomData data); public abstract void onFinish(CustomData data); public abstract void onClose(CustomData data); }
ListenerをinterfaceでなくabstractClassで作る
public abstract class CustomListener { public abstract void onLoad(Custom data); public abstract void onError(Exception e){}; }
option指定したい場合onErrorの引数有りとなしどちらでも良い
public abstract class CustomListener { public abstract void onLoad(Custom data); public void onError(Exception e){}; @Deprecated public void onError() {} }