해결책을 찾았습니다!Android : 팽창 레이아웃이 오래 걸린다
이제 ViewFlipper 대신 ViewPager를 사용합니다. 뷰는 이제 run() 메소드 (웹에서 데이터를 가져와 이미 있기 때문에) 내에 생성되고 Map에 저장됩니다. 내 Handler에서 pagerAdapter.notifyDataSetChanged()를 호출하면 pagerAdapter가 뷰의 Map을 사용하고 원활하고 빠르게 작동합니다. 이제 ViewPager 스크롤을 끝없이 볼 수있는 거리를 찾고 있지만 다른 문제는이 문제와 관련이 없습니다.)
답장을 보내 주시면 감사하겠습니다.
(거대한) 레이아웃을 부 풀릴 때 나는 안드로이드 개발과 새로운 문제에 직면 해있다. 잘 작동하는 Webservice에서 일부 데이터를 가져오고이 데이터를 프론트 엔드로 가져 오기 위해 내 Activity 내에서 핸들러를 사용하고 있습니다. 여기 내 handleMessage은 다음과 같습니다
public void handleMessage(Message msg) {
LayoutInflater inflater = getLayoutInflater();
List<Integer> gamedays = new ArrayList<Integer>(games.keySet());
Collections.sort(gamedays);
for (Integer gameday : gamedays) {
View gamedaytable = inflater.inflate(R.layout.gamedaytable, null);
TableLayout table = (TableLayout) gamedaytable.findViewById(R.id.gameDayTable);
table.removeAllViews();
List<Game> gamelist = games.get(gameday);
int rowcount = 2;
for (Game game : gamelist) {
View tableRow = inflater.inflate(R.layout.gamedayrow, null);
TextView homeTeam = (TextView) tableRow.findViewById(R.id.gameDayHome);
TextView awayTeam = (TextView) tableRow.findViewById(R.id.gameDayAway);
TextView gameResult = (TextView) tableRow.findViewById(R.id.gameDayResult);
gameResult.setBackgroundResource(R.drawable.resultbackground);
homeTeam.setText(game.getHomeTeam().getName());
awayTeam.setText(game.getAwayTeam().getName());
if (game.getHomegoals() < 0 || game.getAwaygoals() < 0) {
gameResult.setText("-:-");
} else {
gameResult.setText(game.getHomegoals() + ":" + game.getAwaygoals());
}
if (rowcount % 2 == 0) {
tableRow.setBackgroundColor(0xffdee0dd);
} else {
// setting alternative background
tableRow.setBackgroundColor(0xfff1f3f0);
}
rowcount++;
table.addView(tableRow);
}
flipper.addView(gamedaytable);
}
flipper.setDisplayedChild(thisgameday - 1);
pd.dismiss();
}
내 문제는이 코드가 매우 느리게 실행이 사라지고 레이아웃이 표시되기 전에 processdialog이 약 1 초 동안 정지 거라고이다. 게임은 자체적으로 9 개의 항목을 포함하는 34 개의 항목으로 구성됩니다. 그래서 34 테이블을 구성하는 relativeLayout()으로 구성된 테이블을 추가합니다. 문제는 안드로이드가 그리기 시작하고 레이아웃을 계산하기 시작하는데 너무 오래 걸린다 고 생각합니다. 내가 올바른지 AsynTask를 사용할 수 없다. 내가 UI 스터프를 할 수없고 UI 스터프 만하고 있기 때문이다.
이렇게하는 동안 프로세스 대화 상자가 멈추지 않는 방법을 찾고 있습니다. 아니면 내가 뭘 일부 completly 잘못된
R.layout.gamedaytable :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff1f3f0"
android:focusableInTouchMode="false" >
<TableLayout
android:id="@+id/gameDayTable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:focusableInTouchMode="false" >
</TableLayout>
</RelativeLayout>
R.layout.gamedayrow :
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusableInTouchMode="false"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/gameDayHome"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="Mannschaft 1" />
<TextView
android:id="@+id/textView2"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text=":" />
<TextView
android:id="@+id/gameDayAway"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mannschaft 2" />
<TextView
android:id="@+id/gameDayResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="5dp"
android:background="@drawable/resultbackground"
android:paddingLeft="10dip"
android:text="0:5"
android:textColor="#FFFFFF"
android:textSize="11dp"
android:textStyle="bold"
android:typeface="monospace" />
</TableRow>
추가 정보 : 이 어떻게 표해야이다 봐. 당신은 확실히 AsyncTask
에서이 작업을 수행 할 수 있습니다
내 코드가 UI 업데이트 (보기 가져 오기 제외)로만 구성되어 있기 때문에 문제가 해결되지 않을 것이라고 생각합니다. 또는 doInBackground에서 레이아웃을 확장하고 publishProgress에서 flipper.addView를 수행 할 수 있습니까? – amfa
그들을 doInBackground에 팽창 시키면 작동 할 수 있습니다. 참조하십시오 : http://stackoverflow.com/questions/6691311/inflate-a-view-in-a-background-thread/6692007#6692007 – elevine
그러나 thethread에 따르면 나는 부작용이있을 수 있기 때문에 나는 이것을해서는 안됩니다. 어쩌면 나는 완전히 다른 솔루션을 사용해야한다. 왜냐하면 창조물이 작동해도 .. viewflipper 자체가 어떻게 든 매우 느리고 "App Feeling"이 없다.) 어쨌든 당신의 도움을 주셔서 감사합니다. – amfa