お世話になっております。
タイトルの件、マルチスレッド処理に対して深い理解力がないため原因究明ができないでおります。
詳しく説明すると
java
1 //xmlparse開始 2 new Thread(new Runnable(){ 3 @Override 4 public void run(){ 5 try{ 6 URL url = new URL("URL" ); 7 Log.d("URL",url.toString()); 8 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 9 String str = InputStreamToString(con.getInputStream()); 10 Log.d("xml",str); 11 XmlPullParser xpp = Xml.newPullParser(); 12 try{ 13 xpp.setInput(new StringReader(str)); 14 }catch (XmlPullParserException e){ 15 Log.d("XmlPullParser", "Error"); 16 } 17 18// XML解析 19 try { 20 int eventType; 21 eventType = xpp.getEventType(); 22 23 while (eventType != xpp.END_DOCUMENT) { 24 if((eventType == xpp.START_TAG)){ 25 if("Prospect_Date".equals(xpp.getName())){ 26 parts1 = xpp.nextText(); 27 }else if("Prospect_Name".equals(xpp.getName())){ 28 parts2 = xpp.nextText(); 29 }else if("Prospect_Number".equals(xpp.getName())){ 30 31 }else if ("countNum".equals(xpp.getName())) { 32 count = Integer.parseInt(xpp.nextText()); 33 handler.post(new Runnable() { 34 @Override 35 public void run() { 36 btn = new Button[count]; 37 txt2 = new String[count]; 38 } 39 }); 40 } 41 }else if(eventType == xpp.END_TAG){ 42 if("listDetail".equals(xpp.getName())){ 43 txt = parts1 + " " + parts2; 44 Log.d("txt1",txt); **←ここは順番通りテキスト1、テキスト2、テキスト3と入ってくる** 45 handler.post(new Runnable() { 46 @Override 47 public void run() { 48 Log.d("txt2",txt);←なぜかここはテキスト3、テキスト3、テキスト3と入ってくる 49 Log.d("intVal",String.valueOf(i)); 50 ll2 = new LinearLayout(List.this); 51 ll2.setOrientation(LinearLayout.HORIZONTAL); 52 53 btn[i] = new Button(List.this); 54 btn[i].setText(txt); 55 LinearLayout.LayoutParams lllp = new LinearLayout.LayoutParams( 56 LinearLayout.LayoutParams.MATCH_PARENT, 57 LinearLayout.LayoutParams.WRAP_CONTENT 58 ); 59 lllp.weight = 1.0f; 60 ll2.addView(btn[i],lllp); 61 Button menu = new Button(List.this); 62 menu.setText("MENU"); 63 ll2.addView(menu); 64 ll1.addView(ll2); 65 btn[i].setOnClickListener(new drawerOpenListener()); 66 i ++; 67 return; 68 } 69 }); 70 i2 ++; 71 } 72 73 } 74 eventType = xpp.next(); 75 } 76 }catch (Exception e){ 77 78 } 79 }catch (Exception ex){ 80 System.out.println(ex); 81 } 82 83 } 84 }).start();
コード中のコメントで申し訳ないですが要はhandler外で変数txtをLogに出力してもちゃんとループで受け取った順に出力してくれるのですがhandler内で変数txtをLogに出力するとループで最後に帰ってくる値(ここでいうところのテキスト3という文字列)がループ回数分出力されます。
試したこととしましてはデバッグで順に追った場合はhandler内外ともに正常に出力できました。
おそらくhandler内の処理が追い付かず変数の値を上書きしているのかと思いますが解決策がわかりません。
(変数を配列にしたりも試しましたが自分の知識ではうまくいきませんでした)
どうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/06 08:50
2016/07/06 09:13
2016/07/06 15:19