前提・実現したいこと
NFCタグを読み取るandroidアプリを作っています。
MainActivity.javaからAsyncTaskを拡張したクラスで非同期処理としてhttp通信を行い、responseを格納した変数をMainActivity.javaで使えるようにしたかったのでこちらのサイトのコードを参考にさせていただきました。
https://akira-watson.com/android/httpurlconnection-post.html
わからないことはAsyncTask側のresult変数をMainActivity.javaがなぜ使うことができているのかという所です。
コードは一部だけ抜粋してます。(動いてはいるので、全体コードではないです。理解のための教えていただけると嬉しいです。)
わかりづらい場合は全コード載せたいと思います。
MainActivity.java
java
1private UploadTask task; 2private TextView textView; 3private EditText editText; 4String url = "post先のURLです"; 5 6@Override 7protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 editText = findViewById(R.id.uriname); 12 13 Button post = findViewById(R.id.post); 14 15 // ボタンをタップして非同期処理を開始 16 post.setOnClickListener(new View.OnClickListener() { 17 @Override 18 public void onClick(View v) { 19 String param0 = editText.getText().toString(); 20 21 if(param0.length() != 0){ 22 task = new postTask(); 23 task.setListener(createListener()); 24 //System.out.println(task.getClass()); 25 task.execute(param0); 26 } 27 28 } 29 }); 30 } 31 32private postTask.Listener createListener() { 33 return new postTask.Listener() { 34 @Override 35 public void onSuccess(String result) { 36 textView.setText(result); 37 } 38 }; 39 }
postTask.java
java
1public class postTask extends AsyncTask<String, Void, String> { 2 3private Listener listener; 4 5//この上にdoInBackgroundメソッドがあり、そこの戻り値であるresultをonPostExecute 6//の引数として受け取ることは理解しています。 7 8// 非同期処理が終了後、結果をメインスレッドに返す 9 @Override 10 protected void onPostExecute(String result) { 11 super.onPostExecute(result); 12 13 if (listener != null) { 14 listener.onSuccess(result); 15 } 16 } 17 18 void setListener(Listener listener) { 19 this.listener = listener; 20 } 21 22 interface Listener { 23 void onSuccess(String result); 24 } 25}
私の考え
私の考えとしては、MainActivity.javaでresult変数を使うことができていますが、postTaskのオブジェクトをexecuteする前にsetListenerでListenerの中の処理を書いているので、実際にはMainActivity.javaにresult変数は渡しておらず、postTask.javaのなかで処理は完結しているんじゃないかと思いました。
なぜ、MainActivity.javaでresult変数が使えるのでしょうか?
回答よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー