回答編集履歴

1

AsyncAppTaskが外部クラスであることを考慮しコード例を修正

2018/05/15 04:14

投稿

kakajika
kakajika

スコア3131

test CHANGED
@@ -2,17 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- AsyncTaskは、非同期処理が完了した時点でメインスレッド上にて `onPostExecute()` を呼び出すので、この中にListViewへデータを反映する処理を書いてあげればOKです。
5
+ AsyncTaskは、非同期処理が完了した時点でメインスレッド上にて `onPostExecute()` を呼び出すので、この中にListViewへデータを反映する処理を書いてあげればOKです。abstractでonPostExecute()を定義しておくことで、MainActivity側に中身の実装を委譲することができます。
6
6
 
7
7
 
8
8
 
9
9
  ```java
10
10
 
11
- // コード例
11
+ // AsyncAppTask.java
12
12
 
13
-
14
-
15
- public class AsyncAppTask extends AsyncTask<String, Void, Void> {
13
+ public abstract class AsyncAppTask extends AsyncTask<String, Void, Void> {
16
14
 
17
15
  ...
18
16
 
@@ -20,53 +18,95 @@
20
18
 
21
19
  @Override
22
20
 
23
- protected void onPostExecute(Void result) {
21
+ protected abstract void onPostExecute(Void result);
24
-
25
- reloadListView();
26
-
27
- }
28
22
 
29
23
  }
30
24
 
25
+ ```
31
26
 
32
27
 
33
- // in Activity
34
28
 
35
- // ListViewに表示するデータを更新する
29
+ ```java
36
30
 
37
- private void reloadListView() {
31
+ // MainActivity.java
38
32
 
39
- List<Map<String, String>> dataList = new ArrayList<Map<String,String>>();
33
+ public class MainActivity extends AppCompatActivity {
40
34
 
41
- for(int item = 0; item < RssList.title.size(); item++){
42
35
 
43
- Map<String, String> map = new HashMap<String, String>();
44
36
 
45
- map.put("title", RssList.title.get(item));
37
+ @Override
46
38
 
47
- map.put("link", RssList.link.get(item));
39
+ protected void onCreate(Bundle savedInstanceState) {
48
40
 
41
+ ...
42
+
43
+
44
+
45
+ // onPostExecuteの中身をここで実装する
46
+
47
+ AsyncAppTask task = new AsyncAppTask() {
48
+
49
+ @Override
50
+
51
+ protected void onPostExecute(Void result) {
52
+
49
- dataList.add(map);
53
+ reloadListView();
54
+
55
+ }
56
+
57
+ };
58
+
59
+
60
+
61
+ ...
50
62
 
51
63
  }
52
64
 
53
65
 
54
66
 
55
- SimpleAdapter adapter = new SimpleAdapter(this, dataList,
56
-
57
- android.R.layout.simple_list_item_2,
67
+ ...
58
-
59
- new String[]{"title", "link"},
60
-
61
- new int[]{android.R.id.text1, android.R.id.text2});
62
68
 
63
69
 
64
70
 
65
- // ListViewにadapterをセットして、表示するデータを更新する
71
+ // ListViewに表示するデータを更新するメソッド
66
72
 
67
- ListView listView = (ListView) findViewById(R.id.listView);
73
+ private void reloadListView() {
68
74
 
75
+ List<Map<String, String>> dataList = new ArrayList<Map<String,String>>();
76
+
77
+ for(int item = 0; item < RssList.title.size(); item++){
78
+
79
+ Map<String, String> map = new HashMap<String, String>();
80
+
81
+ map.put("title", RssList.title.get(item));
82
+
83
+ map.put("link", RssList.link.get(item));
84
+
85
+ dataList.add(map);
86
+
87
+ }
88
+
89
+
90
+
91
+ SimpleAdapter adapter = new SimpleAdapter(this, dataList,
92
+
93
+ android.R.layout.simple_list_item_2,
94
+
95
+ new String[]{"title", "link"},
96
+
97
+ new int[]{android.R.id.text1, android.R.id.text2});
98
+
99
+
100
+
101
+ // ListViewにadapterをセットして、表示するデータを更新する
102
+
103
+ ListView listView = (ListView) findViewById(R.id.listView);
104
+
69
- listView.setAdapter(adapter);
105
+ listView.setAdapter(adapter);
106
+
107
+ }
108
+
109
+
70
110
 
71
111
  }
72
112