2012-10-09 2 views
2
package com.example.asynctask; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ProgressBar; 

public class MainActivity extends Activity { 
    ProgressBar progressbar; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     progressbar = (ProgressBar) findViewById(R.id.progressBar); 
    } 

    class ProgressTask extends AsyncTask<Integer, Integer, Void> { 

     private boolean flag = true; 

     @Override 
     protected void onPreExecute() { 
      progressbar.setMax(100); 
     } 

     @Override 
     protected void onCancelled() { 
      //progressbar.setMax(0); 
      flag = false; 
      Log.v("onCancelled:flag", String.valueOf(flag)); 
     } 

     @Override 
     protected Void doInBackground(Integer... params) { 
      // TODO Auto-generated method stub 
      int start = params[0]; 
      for (int i = start; i <= 100; i=i+10) { 

       if (!flag) { 
        break; 
       } else { 
        publishProgress(i); 
        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         Log.e("ThreadError", e.toString()); 
        } 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      progressbar.setProgress(values[0]); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.v("Progress", "Finish"); 
     } 

    } 

    public void onClick(View v) { 
     ProgressTask task = new ProgressTask(); 

     switch (v.getId()) { 
     case R.id.start: 
      task.execute(10); 
      break; 

     case R.id.stop: 
      task.cancel(true); 
      break; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

Start를 누르면 진도 표시 줄을 업데이트하기 시작하는 Symple AsyncTask 앱이 있습니다. 그러나 당신이 멈추지 않을 때, 멈추지 않을 것입니다. 전화 할 때 것입니다 onCancelled() 방법이 호출되고 거짓에 플래그의 값을 변경하지만 플래그 남아 onCancelled() 값이됩니다 않습니다, task.cancel (참) 참된. 나는 또한 시도했다 isCancelled()는 flag의 자리에 성공하지 못했다. 잠시 내 문제는 Ollie C과 유사하지만 예외는 발생하지 않습니다. Wenhui이 코멘트에 지적한 바와 같이비동기 작업이 중지되지 않습니다.

+3

이 줄에서'ProgressTask task = new ProgressTask();'입니다. 당신의'task'는 그 메소드의 범위 내에 있습니다. 클래스 인스턴스'task'를 생성해야합니다. – Wenhui

+0

@Wenhui 그것은 일했다 ... 감사합니다 – nik

답변

0

는, 내가 선언 온 클릭 (보기 V) 내부 작업을 인스턴스화하는 바보 같은 실수를했다.

관련 문제