2012-03-16 2 views
3

갱신 1AsyncTask를 : 활동에 값을 전달 (에서 onCreate 법)

활동

public Integer _number = 0; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
if (_number >0) 
     { 
      Log.d("onSuccessfulExecute", ""+_number); 
     } 
     else 
     { 
      Log.d("onSuccessfulExecute", "nope empty songs lists"); 
     } 
} 

public int onSuccessfulExecute(int numberOfSongList) { 

_number = numberOfSongList; 

if (numberOfSongList >0) 
{ 
    Log.d("onSuccessfulExecute", ""+numberOfSongList); 
} 
else 
{ 
    Log.d("onSuccessfulExecute", "nope empty songs lists"); 
} 
    return numberOfSongList; 
} 

최종 갱신 1

UPDATE : AsynchTask 자체 외부 클래스를 갖는다. 활동 AsyncTask를 onPostExecute() ...에서 값을 전달하는 방법

내 코드 ((onPostExecute에서 값을 반환)와 UI에 업데이트하지만 난 활동 변수를 설정하는 방법을 찾고 있어요 않습니다 NumberOfSongList) AsynchTask에서 오는.

AsyncTask를 클래스 :

@Override 
    public void onPostExecute(asynctask.Payload payload) 
    { 
     AsyncTemplateActivity app = (AsyncTemplateActivity) payload.data[0]; 

      //the below code DOES UPDATE the UI textView control 
      int answer = ((Integer) payload.result).intValue(); 
      app.taskStatus.setText("Success: answer = "+answer); 

      //PROBLEM: 
      //i am trying to populate the value to an variable but does not seems like the way i am   doing: 
      app.NumberOfSongList = payload.answer; 
      .............. 
      .............. 
    } 

활동 :

public Integer NumberOfSongList; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //Several UI Code 
     new ConnectingTask().execute(); 
     Log.d("onCreate", ""+NumberOfSongList); 

    } 
+0

'Log.v()'호출에서'NumberOfSongsList'를보기를 기대한다면'AsyncTask'가 작업을 끝내지 않았기 때문에 발생하지 않을 것입니다. 정확하게'asynctask.PayLoad' 응답입니까? – Luksprog

+0

Log.d ("onCreate ....")에서 업데이트되지 않습니다. asyncTask 및 스레드의 오버 헤드로이 문제가 발생합니다. 나중에 값이 업데이트되었는지 확인 했습니까? – eyespyus

+0

예 log.di에서 업데이 트되지 않습니다. .. 그게 내가 왜 도움이 필요 ... 그래, 그것은 onPostExecute에서 값을 업데이 트하고 그것을 볼 수 있지만 활동에 없습니다. –

답변

2

세터 방법은 어떻게 사용합니까? 예 :

private int _number; 
public int setNumber(int number) { 
    _number = number; 
} 

UPDATE :

이 코드를보고하십시오. 이것은 당신이 성취하려는 것을 할 것입니다.

활동 클래스

public class TestActivity extends Activity { 
    public int Number; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.test); 

     Button btnDisplay = (Button) findViewById(R.id.btnDisplay); 
     btnDisplay.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       Toast toast = Toast.makeText(v.getContext(), "Generated number: " + String.valueOf(Number), Toast.LENGTH_LONG); 
       toast.show();    
      } 
     }); 

     new TestTask(this).execute(); 
    } 
} 

AsyncTask를 클래스

public class TestTask extends AsyncTask<Void, Void, Integer> { 
    private final Context _context; 
    private final String TAG = "TestTask"; 
    private final Random _rnd; 

    public TestTask(Context context){ 
     _context = context; 
     _rnd = new Random(); 
    } 

    @Override 
    protected void onPreExecute() { 
     //TODO: Do task init. 
     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 
     //Simulate a long-running procedure. 
     try { 
      Thread.sleep(3000);   
     } catch (InterruptedException e) { 
      Log.e(TAG, e.getMessage()); 
     } 

     return _rnd.nextInt(); 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     TestActivity test = (TestActivity) _context; 
     test.Number = result;  
     super.onPostExecute(result); 
    } 
} 
+0

나는 getter 및 setter 함께 시도했지만 작동하지 않습니다. –

+0

AsyncTask slukian으로 지적한 일을 끝내지 않았기 때문에이 작동하지 않습니다 그리고 어떤 의미가 있고 내가 가지고 내가 디버깅하는 동안 알게되었습니다. –

+0

감사하지만, 질문이 있는데, 왜 내가 'TestActivity test = (TestActivity) _context;라는 활동 이름을 하드 코딩해야합니까? 액티비티를 호출 할 수 있어야하지만, 만약 내가 당신의 접근법과 관련된다면 나는 그 액티비티가 하드 코딩 된 것을 볼 수 있습니다 ... 어떤 생각입니까? –

0

가 리스너를 만듭니다.

새 클래스 파일을 만드십시오. 즉,

public class myActivity extends Activity implements MyAsyncListener { 

이 AsyncTask를 위해 생성자에 리스너를 추가하고 글로벌 VAR로 설정,

public interface MyAsyncListener() { 
     onSuccessfulExecute(int numberOfSongList); 
} 

당신의 활동이 MyAsyncListener을 구현합니다 : MyAsyncListener와 같은 이름을 호출하고이처럼 보이게 Async 클래스에서. 그런 다음 onPostExecute에서 수신기의 메서드를 호출하고 데이터를 전달합니다.

@Override 
public void onSuccessfulExecute(int numberOfSongList) { 
     \\do whatever 
} 

행운을 빕니다 : 당신의 AsyncTask를 완료 할 때마다

public class MyCustomAsync extends AsyncTask<Void,Void,Void> { 

     MyAsyncListener mal; 

     public MyCustomAsync(MyAsyncListener listener) { 
      this.mal = listener; 
     } 

     @Override 
     public void onPostExecute(asynctask.Payload payload) { 
      \\update UI 
      mal.onSuccessfulExecute(int numberOfSongList); 
     } 
} 

지금, 그것은처럼 보일 것입니다 액티비티 클래스의 메소드 onSuccessfulExecute를 호출합니다.

+0

가 작동하지 않습니다 ... 오류가 아니지만 값을 표시하지 않습니다 .. 나는 질문을 업데이 트합니다 –

1

주의 그냥 단어 : AsyncTask를에서 활동 인스턴스에 대한 참조를 개최 할 때 매우주의 - I 어려운 방법으로 이것을 발견했다 :). 백그라운드 작업이 실행 중일 때 사용자가 장치를 돌리면 활동이 삭제되고 다시 작성되므로 활동에 대한 참조가 무효화됩니다.

+0

당신이 볼 수 있듯이 저는 AsyncTask를 자신의 클래스보다는 액티비티가있는 하위 클래스가 아닌 매우 도전적 인 것처럼 보이기 위해 애 쓰고 있습니다 ... 그리고 저는 깨닫기 시작했습니다. diff, 자신의 클래스 대 데 하위 클래스 .. 데 어떤 생각? –

+0

AsyncTask가 수행하는 기능의 유형을 알려주십시오. (웹 서비스 호출 등)? – px3j

+0

예 httpGet을 호출하고 URL 배열을 반환하는 중 ... –

관련 문제