質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

Androidの非同期処理でつくったファイルをうまく利用できません。

footrest
footrest

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0グッド

0クリップ

224閲覧

投稿2022/12/08 03:22

編集2022/12/09 01:47

前提

AndroidStudio(言語はJava)で青空文庫の専用ブラウザのようなものを作ろうとしています。

画面の動きとしては
①あ行~わ行のRcyclerView(「○行の作品をさがす」というメッセージ)
②行の選択後、作品名の頭文字を選択する(たとえば、た行を選んだのであれば「『た』から始まる作品を探す」~「『と』から始まる作品を探す」をRecyclerViewで表示)
③各作品名をRecyclerViewで表示
④作品の本文ページ(XHTML版ページ)をWebViewで表示という感じです。

画面外の動きとしては
・画面遷移の際にintentでクリック位置を渡しています。

・③においてAsyncTaskでweb上の作品一覧ページのHTMLファイルを取得し、キャッシュファイルに保存後、アクティビティからそれを読み込みRecyclerView表示用のリストを生成しています。

・また、④においてWebViewで表示するURLを生成するために、作品一覧ページ、図書カードページの読み込みを行っています。

問題

エラーは出ていないのですが、②の画面での選択後に、そこで選択したものとは違う③の画面がつくられます。
たとえば、②で「『き』から始まる作品を探す」を選択したのに③では「あ」から始まる作品が表示されるという感じです。

一度①まで戻って次に「い」を選ぶなどすると「き」の作品一覧が表示されたりするので、どうやら前回選択したものが表示されるらしく、作品一覧ページのHTML取得/キャッシュへの保存に問題があるのではと考えています。

実現したいこと

  • 作品一覧の表示・選択の機能が正しく動作するようにする

該当のソースコード

(webファイル取得)

Java

1public class AsyncHttpRequest extends AsyncTask<URL, Void, String> { 2 private Activity mainActivity; 3 protected String resultText; 4 public AsyncHttpRequest(Activity activity){ 5 this.mainActivity = activity; 6 } 7 8 @Override 9 protected String doInBackground(URL[] urls) throws NullPointerException { 10 //書き込む場所・ファイル名の指定 11 Context context = mainActivity.getApplicationContext(); 12 File file = new File(context.getCacheDir(), "aozoraBunko.html"); 13 resultText = ""; 14 15 //http接続・web上のデータ取得 16 HttpURLConnection urlCon = null; 17 StringBuilder stringBuilder = new StringBuilder(); 18 try { 19 urlCon = (HttpURLConnection) urls[0].openConnection(); 20 urlCon.setRequestMethod("GET"); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 PrintWriter pw = null; 25 String result = null; 26 try { 27 urlCon.connect(); 28 29 InputStream in = urlCon.getInputStream(); 30 BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 31 32 String line = ""; 33 while ((line = reader.readLine()) != null) { 34 stringBuilder.append(line); 35 } 36 in.close(); 37 38 //書き込み 39 FileWriter fw = new FileWriter(file, false); 40 BufferedWriter bw = new BufferedWriter(fw); 41 pw = new PrintWriter(bw); 42 result = stringBuilder.toString(); 43 result = result.replace("\\",""); 44 result = result.replace("%",""); 45 pw.printf(result); 46 urlCon.disconnect(); 47 pw.close(); 48 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } catch (NullPointerException e) { 52 e.printStackTrace(); 53 } finally { 54 } 55 return result; 56 } 57 58 }

②の表示、クリックリスナーを担うRecyclerViewAdapter

Java

1public class SakuhinIchiranRecyclerviewAdapter extends RecyclerView.Adapter<AtoWaRecyclerViewHolder>{ 2 private List<RowData> list; 3 4 public SakuhinIchiranRecyclerviewAdapter(List<RowData> list){ 5 this.list = list; 6 } 7 8 @Override 9 public AtoWaRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 10 View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.bookname_recycler_layout,parent,false); 11 AtoWaRecyclerViewHolder vh = new AtoWaRecyclerViewHolder(inflate); 12 return vh; 13 } 14 15 @Override 16 public void onBindViewHolder(AtoWaRecyclerViewHolder holder, int position) { 17 holder.titleView.setText(list.get(position).getTitle()); 18 holder.detailView.setText(list.get(position).getDetail()); 19 20 holder.itemView.setOnClickListener(new View.OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 Intent intent = new Intent(v.getContext(), ReadfromSakuhinmeiActivity.class); 24 int position = holder.getLayoutPosition(); 25 String sakkaSeq = SakuhinIchiranActivity.sakka.get(position); 26 String cardSeq = SakuhinIchiranActivity.card.get(position); 27 String firstURL = "https://www.aozora.gr.jp/cards/" + sakkaSeq +"/" + cardSeq + ".html"; 28 intent.putExtra("sakka", sakkaSeq); 29 URL url = null; 30 try { 31 url = new URL(firstURL); 32 } catch (MalformedURLException e) { 33 e.printStackTrace(); 34 } 35 AsyncHttpRequest2 task = new AsyncHttpRequest2((Activity) v.getContext()); 36 task.execute(url); 37 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 38 ((Activity) v.getContext()).finish(); 39 SakuhinIchiranActivity.sakka.clear(); 40 SakuhinIchiranActivity.card.clear(); 41 v.getContext().startActivity(intent); 42 43 } 44 }); 45 46 } 47 @Override 48 public int getItemCount(){ 49 return list.size(); 50 } 51} 52

③のアクティビティ

Java

1public class SakuhinIchiranActivity extends AppCompatActivity { 2 public static List<String> sakka = new ArrayList<>();//④でのURL生成用のリスト 3 public static List<String> card = new ArrayList<>();//④でのURL生成用 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_sakuhin_ichiran); 9 10 Intent intent = this.getIntent(); 11 int shiin = intent.getIntExtra("shiin",0); 12 int boin = intent.getIntExtra("boin",0); 13 14 15 String[] persons1 = {"", "k", "s", "t", "n", "h", "m", "y", "r", "w"}; 16 String[] persons2 = {"a", "i", "u", "e", "o"}; 17 String urltext = "https://www.aozora.gr.jp/index_pages/sakuhin_" + persons1[shiin] + persons2[boin] + "1.html"; 18 URL url = null; 19 try { 20 url = new URL(urltext); 21 } catch (MalformedURLException e) { 22 e.printStackTrace(); 23 } 24 //AsyncHttpRequest task = new AsyncHttpRequest(this); 25 //task.execute(url); 26 27 List<RowData> dataset = new ArrayList<>(); 28 dataset = this.createDataset(); 29 30 RecyclerView recyclerView = findViewById(R.id.sakuhinIchiranRecyclerView); 31 SakuhinIchiranRecyclerviewAdapter adapter = null; 32 try{ 33 adapter = new SakuhinIchiranRecyclerviewAdapter(dataset); 34 }catch (Exception e){ 35 e.printStackTrace(); 36 } 37 38 LinearLayoutManager llm = new LinearLayoutManager(this); 39 recyclerView.setHasFixedSize(true); 40 recyclerView.setLayoutManager(llm); 41 recyclerView.setAdapter(adapter); 42 } 43 44 private List<RowData> createDataset(){ 45 Context context = this; 46 List<RowData> rowData = new ArrayList<>(); 47 48 File file = new File(context.getCacheDir(),"aozoraBunko.html"); 49 String result = ""; 50 try { 51 BufferedReader bufferedReader = new BufferedReader(new FileReader(file.getPath())); 52 String texts = ""; 53 StringBuilder stringBuilder = new StringBuilder(); 54 while((texts = bufferedReader.readLine()) != null){ 55 stringBuilder.append(texts); 56 } 57 result = stringBuilder.toString(); 58 bufferedReader.close(); 59 } catch (FileNotFoundException e) { 60 e.printStackTrace(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 result = result.substring(result.indexOf("<center>")+8,result.indexOf("</center>")); 65 String[] words = result.split("<tr vAlign=\"top\">"); 66 words[0] = "html\">&</a>" ; 67 words[1] = "html\">&</a>" ; 68 69 for(int i=2;i< words.length;i++){ 70 int first_divide = words[i].indexOf("cards")+6; 71 int second_divide = words[i].indexOf(".html"); 72 String urlseq=""; 73 urlseq = words[i].substring(first_divide,second_divide); 74 String toSakka = urlseq.split("/")[0]; 75 String toCard = urlseq.split("/")[1]; 76 sakka.add(toSakka); 77 card.add(toCard); 78 } 79 80 List<String> sakuhin = new ArrayList<>(); 81 Pattern pattern = Pattern.compile("/cards/(\\d*)/card(\\d*)\\.html\">(.*)</a>"); 82 for(int i =2 ;i< words.length;i++) { 83 Matcher match = pattern.matcher(words[i]); 84 while(match.find()){ 85 sakuhin.add(match.group(3)); 86 } 87 } 88 89 for(int i=0; i<sakuhin.size();i++){ 90 RowData data = new RowData(); 91 data.setTitle(Integer.toString(i+1)); 92 data.setDetail(sakuhin.get((i) )); 93 rowData.add(data); 94 } 95 96 return rowData; 97 } 98 99}

試したこと

getCacheDir()をgetFilesDir()にする、書き込みの前にfile.delete();で前回作られたファイルを消すなどしましたが解決できませんでした(後者に至ってはエラーで動作せず(ファイルが存在しないということでしょうか?))。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/12/08 05:24 編集

コードのマークダウンの言語名を書く所に言語名以外は書かないようにしてください。 スクロールしないので長いと読めません。 AsyncTask は API30 から非推奨になっていますので、代替方法を探された方が良いと思います、 ついでに、再表示のためだけにアクティビティが自殺して再実行するような必要は無いと思います。
jimbe

2022/12/08 05:42

SakuhinIchiranActivity で AtoWaRecyclerviewAdapter3 を使っていないようですが…。
footrest

2022/12/08 06:03

コメントありがとうございます。 ・AsyncTaskが非推奨というのを先日知ったのでExecutor(?)を使ったものを並行して作っています。 ・はじめはFragmentを使っていこうとしていたのですが、RecyclerViewと組み合わせて次のFragmentにデータを渡すことがうまくできず暫定的にアクティビティで作ってみました。アクティビティのクリアが不要ということですね、ありがとうございます ・アダプターは間違ったものを貼り付けていたので差し替えました。 いろいろと不備があり申し訳ないです。
jimbe

2022/12/08 17:35 編集

どんな感じになるのかと、前後の画面関係が無いのでファイルを使わないで各あいう毎のリストを出すだけのを作ってみました。 https://github.com/Jimbe-github/q_lm3admtis2c6ua html の解析に jsorp を使っています。通信のキャンセルはテストしてないのでバグがあるかもしれません。 作っていたので編集されたコードはこれから見させて頂きます^^; ・・・何か、アダプタで使っているのが AsyncHttpRequest2 となっていますが・・・。 アダプタから SakuhinIchiranActivity が start かと思いきや ReadfromSakuhinmeiActivity ですし、 SakuhinIchiranActivity が②のアクティビティなんでしょうか。 質問されている状況をこちらで再現するにはどう修正してどう実行すれば良いでしょうか。

回答1

0

自己解決

task.execute()のあとにsleep(1000)を入れたらうまく動くようになったので、非同期処理が間に合っていなかったようです。
waitを使うなどしてうまくやっていこうと思います。

投稿2022/12/09 01:49

footrest

総合スコア1

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。