2017-12-04 17 views
0

참고 : 객체 지향 프로그래밍 및 Android Studio에서 처음 사용하기 때문에 전문 용어로 잘하지 않습니다.클래스의 메소드에서 액티비티 변수를 설정할 수 없습니다.

android 스튜디오에서 JSON 가져 오기 작업을위한 클래스를 만들었습니다. (백그라운드 오버라이드에는 do가 포함되지 않습니다). 지금 내 활동에

public class jsonTasks extends AsyncTask<String, String, String> { 


public interface AsyncResponse { 
    void processFinish(String output); 
} 

private AsyncResponse delegate = null; 

jsonTasks(AsyncResponse delegate){ 
    this.delegate = delegate; 
} 

@Override 
protected void onPostExecute(String result) { 
    delegate.processFinish(result); 
} 

:

public class activity extends Activity { 
    // in here I've declared the string variable 
    String valuableInfo; 

    // FIRST TASK 
    jsonTasks asyncTask = new jsonTasks(new jsonTasks.AsyncResponse() { 

     @Override 
     public void processFinish(String output) { 
      String TAG = activity.class.getSimpleName(); 
      JSONObject info; 

      //i do stuff with the json here 
      //i set the textboxes normally 
      txtSumName.setText(sumInfo.getString("name")); 

      //but setting the string valuableInfo is not working 
      valuableInfo = "info I took from json operation" 

     }); 
    // and here I execute 
    asyncTask.execute("url"); 

    // SECOND TASK 
    jsonTasks asyncTask2 = new .... { 
    ................. 
    } 
    asyncTask2.execute("https://example.com/" + valuableInfo); 
} 

내가 그 변수를 사용하려면 사용으로 URL에 valuableInfo가 가져 오는 계속 또 다른 "asyncTask2"입니다.

두 번째 "asyncTask2"를 실행할 때 변수는 항상 null입니다.

답변

3

AsyncTask는 비동기 적으로 작업을 수행합니다. 즉, 즉시 결과를 얻지 못할 것이므로 valueableInfo을 사용하기 전에 완료 될 때까지 기다려야합니다. 오버라이드 할 수있는 방법이 있는데, onPostExecute입니다. 작업이 완료되고 정보를 사용할 수있게되면 트리거됩니다. 여기서 두 번째 작업을 실행하면 그 시점에서 null이되지 않습니다.

두 작업을 병합 할 수도 있습니다.

+0

죄송합니다 코드에 onPostExecute 메서드 재정의를 추가했습니다. 모두 onPostExecute에서 실행됩니다. (메인 포스트 편집) 변수 선언과 관련이 있다고 생각합니다. 나는 정말로 모른다. – quelotic

+0

두 번째 AsyncTask는 여전히 processFinishe 콜백을 기다리지 않고 있습니다. processFinish() 내의 마지막 줄에 asyncTask2.execute()를 넣으십시오. – Vlad

+0

위 코드에서 두 개의 jsonTask가 생성됩니다. new jsonTask (JsonTask.Response {})와 같은 것을 시도하고 'new'키워드를 두 번 사용하지 마십시오. –