2013-10-25 4 views
1

오류없이 컴파일하고 런타임 오류가 발생하지 않습니다. 안녕하세요, Android의 합계에 대한 간단한 질문이 있습니다. 간단한 요약을하고 코드를 컴파일하고 기술적으로 수행 할 작업을 120 개가 넘을 때까지 계산합니다. 그러나 루프를 통과 할 때 각 출력을 표시하도록 출력을 원했습니다. 불행히도, 그것은 바로 텍스트 뷰의 마지막 합계로 즉시 점프합니다. 수면 함수를 사용하여, 함수를 기다렸다가 시도했지만 무슨 일이 일어 났는지 합계가 120보다 클 때까지 모든 루프에 대한 시간을 기다렸다가 최종 합을 출력했습니다. 이 경우 4950. 텍스트보기에서 각 합계를 표시하기위한 제안은 무엇입니까?간단한 합계 프로그램 Android java

각 줄을 개별적으로 보여주는이 코드 줄을 사용해 보았지만 타이머를 즉시 시작했습니다. 그것은해서는 안된다. Toast.makeText (MainActivity.isis, "SUM :"+ sum1, Toast.LENGTH_SHORT) .show();

합보다 큰 120 시작 타이머

질문 내 간단한 응용 프로그램 1) 각각의 합 2보기)의

기본 목표 : 내가 대신 텍스트보기에 개별적으로 각각의 합계를 보여 얻는 방법 최종 합계로 점프?

public void onClick(View v) 

       for(i=0;i<100;i++) 
        { 
         sum1 = sum1 + i; 
          sum.setText("Sum:"+sum1); 
         if(sum1 > 120) 

          { 
          timer.start(); 
          } 
        } 

    } 

감사합니다.

+1

한 번에 개별적으로 하나를 각각의 합계를 보여 하시겠습니까 , 또는보기에서 모든 합계를 표시하도록 하시겠습니까? – nhgrif

+0

개별적으로 한 번에 하나씩 – user2246076

답변

0

이 내 제안 솔루션 : D

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/resultView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/startButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start counting" /> 

</LinearLayout> 

MainActivity.java

public class MainActivity extends Activity implements OnClickListener { 

    private static final long SUM_DELAY = 100; 

    private TextView mResultView; 
    private Button mStartButton; 

    private Handler mHandler = new Handler(); 

    private int mSum = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mResultView = (TextView) findViewById(R.id.resultView); 
     mStartButton = (Button) findViewById(R.id.startButton); 

     mStartButton.setOnClickListener(this); 
    } 

    private Runnable sumTask = new Runnable() { 

     @Override 
     public void run() { 

      mSum += 1; 

      if (mSum > 120) { 

       mSum = 0; 
       mStartButton.setEnabled(true); 

       return; 
      } 

      mResultView.setText(String.valueOf(mSum)); 

      mHandler.postDelayed(this, SUM_DELAY); 
     } 
    }; 

    @Override 
    public void onClick(View view) { 

     if (view.getId() == mStartButton.getId()) { 

      mStartButton.setEnabled(false); 
      sumTask.run(); 
     } 
    } 

} 
+0

예를 들어 주셔서 감사합니다! – user2246076

0

UI 스레드에서 실행되는 것은 onClick()입니다. 즉, UI가 다시 업데이트되기 전에 전체 메서드가 완료되어야하므로 마지막 번호로 갑자기 이동해야합니다. 이것은 또한 Thread.Sleep()을 사용할 때 아무 일도 일어나지 않는 이유이기도합니다. 이 경우에는 sleep()이 UI 스레드에 적용되므로 전체 앱이 정지됩니다.

TextView를 계산하려면 AsyncTask을 사용해야합니다. 루프를 추가하고 Thread.sleep()doInBackground()에 추가하고 진행률을 게시하고 onProgressUpdate()에 텍스트를 설정합니다. 링크는 실제로 당신을 위해 좋은 예제를 포함하고 있습니다.

2

UI 스레드를 차단하는 동안 클릭하는 동작이 for 루프를 실행하기 때문에 마지막으로 "Jumps"하는 이유가 있습니다. 실제로 텍스트가 변경되는 것을 볼 수는 없지만 변경되는 것은 볼 수 있습니다. Timer 또는 TimerTask을 사용하여 필요한 것을 달성 할 수 있습니다. 기본적으로 별도의 스레드가 생성됩니다. 또한 필요한 지연을 처리합니다. Timers 실행 방법에서 수학을 수행하십시오.

//make sure these are global 
int i = 0; 
int sum1 = 2;//not really sure where your sum starts so you choose 

TimerTask leTask = new TimerTask() { 
       public void run() { 
        sum1 = sum1+i; 
        i++; 
        /*I don't actually remember if you must go back to the main thread 
        * when in the tasks run method. Incase you get an error because 
        * of that then just do that quickly. I have included a link for 
        * you on how to do that if necessary.*/ 
        sum.setText("Sum:"+sum1); 
        if(sum1 > 120){ 
         /*Start your actually timer here 
         * and stop execution of leTask by calling the cancel method*/ 
        }   
       } 
int delay = 0;//you don't really want a delay since you want it immediately after click 
int everySecond = 1000; 
timer.scheduleAtFixedRate(leTask, 0, everySecond); 

ti를 설정하는 방법은 단지 예일뿐입니다. 취소되었을 때 leTask (또는 무엇이라고 부르는 지)에 대한 액세스 권한이 있는지 확인해야합니다. isum1도 전역이어야합니다. delayeverySecond은 변수 일 필요는 없습니다. 나는 그것이 그들이하는 일을 설명하기 위해 그것을했다. 그래서 그것은 조금 더 의미가있다. TextView를 업데이트하는 것을 제외하고는 UI 스레드에 대해 걱정하지 않으므로이 메서드가 더 마음에 듭니다.

편집 : TextViewpost 방법을 사용하여 타이머에서 UI에 액세스 할 수도 있습니다.그것은 다음과 같이 보일 것입니다 :

sum.post(new Runnable() { 
    public void run() { 
     sum.setText("Sum:"+sum1); 
    }); 
} 

EDIT2 :


난 그냥 TimerTimerTask 것을 발견이 건너 누가 미래의 사용자에 대한 철저한 수 있도록이 편집을 포함해야 더 이상 명령 등을 스케줄하는 데 선호되는 방법이되지 않습니다. 이제는 ScheduledThreadPoolExecutor이어야합니다. 이것이 약간의 시간의 경우 였지만 여기에 관해서 나는 많은 것을 보았습니다. 두 경우 모두 안드로이드는 here 문서에 있습니다. 말 그대로 두 번째 문장과 같습니다.

+0

아마 타이머를 사용하는 것이 훨씬 쉬울 것이라고 덧붙여 야합니다. 스레드를 사용하고 잠자고 UI를 업데이트하는 것은 정확히 필요한 프로세스이지만 Timer는 기본적으로 UI 업데이트를 제외하고 내장되어 있습니다. 따라서 타이머를 사용하여 2 초마다 또는 그 다음에 마지막 타이머를 발사하여 필요한 모든 작업을 수행 할 수 있습니다. – Andy

+0

간단히 타이머를 정의한 다음 sum.setText 행 뒤에 배치할까요? – user2246076

+0

일부 빠른 코드 (테스트되지 않음)가 포함됩니다. – Andy