2

나는 그물에서 Json을 얻기 위해 AsyncTask를 작성한 클래스가 있습니다. 비동기 작업이 완료 될 때까지 비동기 작업이 완료 될 때까지 UI 스레드의 실행을 중지하는 방법 안드로이드에서 AsyncTask에 들어있는 값

public class MyAsyncGetJsonFromUrl extends AsyncTask<Void, Void, JSONObject> { 
    Context context_; 
    String url_; 
    List<NameValuePair> params_; 

    public MyAsyncGetJsonFromUrl(Context context_, List<NameValuePair> params_, String url_) { 
     this.context_ = context; 
     this.params_ = params_; 
     this.url_ = url_; 
    } 

    @Override 
    protected JSONObject doInBackground(Void... params) { 
     JSONObject jObj_ = null; 
     try { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url_); 
      httpPost.setEntity(new UrlEncodedFormEntity(params_)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      InputStream is_ = httpEntity.getContent(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is_.close(); 
      String json_ = sb.toString(); 
      Log.e("JSON", json); 

      jObj_ = new JSONObject(json_); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return jObj_; 
    } 

    protected void onPostExecute(JSONObject jObj_) { 
     jObj = jObj_; 
    } 
} 

또한이 클래스의 메소드를 호출 활동이 JSON 개체를 반환하는 방법이있다.

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) { 
    new MyAsyncGetJsonFromUrl(context, params, url).execute(); 
    return jObj; 
} 

이제 문제는 즉시 라인 return jObj;가 호출되고 널 (null)이 리턴 AsyncTask를 new MyAsyncGetJsonFromUrl(context, params, url).execute();를 시작한 후입니다. 그래서 비동기 작업이 완료 될 때까지 실행을 멈추고 싶습니다. 그리고 다른 질문이이 시나리오와 완전히 동일하지 않으므로이 질문을 중복으로 언급하지 마십시오.

답변

5

비동기 작업은 비동기입니다. 이는 프로그램이 현재 스레드 (백그라운드 스레드에서 실행)와 독립적으로 백그라운드에서 실행됨을 의미합니다. 따라서 비동기 작업이 완료 될 때까지 프로그램 실행을 중단해서는 안됩니다.

그래서 당신은 두 가지 옵션이 있습니다 :

  • onPostExecute() 방법 비동기 작업에서 값을 지정 UI 스레드 자체에 대신 비동기 작업

  • 에서 코드를 실행을

비동기 작업으로 이동하여 옵션 B를 사용하기로 결정한 경우 정적 변수 또는 JSO의 값과 같은 일부 정적 변수를 사용할 수 있습니다 N 개체는 비동기 작업의 끝에서 할당 될 수 있으며 나중에 액세스 할 수 있습니다. 비동기 작업이 작업을 완료 한 후에이 메서드가 UI 스레드에서 실행 중이므로 onPostExecute() 메서드 자체 (예 : 개체를 구문 분석하고 사용자에게 표시)의 JSON 개체로 수행해야하는 모든 후 처리 작업을 수행 할 수도 있습니다 백그라운드 스레드에서. 당신이 당신의 비동기 작업에서 반환 값이 필요한 경우

, 당신은 같은 것을 수행 할 수 계산이 같은 예외 등이있는 경우를 제외하고 완료 될 때까지이 경우

jObj = new MyAsyncGetJsonFromUrl(context, params, url).execute().get(); 

을, 프로그램은 대기 쓰레드가 인터럽트되거나 취소됨 (메모리 제약 등으로 인해). 그러나이 방법은 일반적으로 권장되지 않습니다. 비동기 작업의 포인트는 비동기 작업을 허용하고 프로그램 실행이 그로 인해 중지되지 않아야한다는 것입니다.

반환 값은 doInBackground()에서 매개 변수로 OnPostExecute() 메서드로 전달됩니다. onPostExecute에 반환 값을 넣지 않아도되므로 UI ​​스레드 자체에서 실행됩니다. 결과를 사용하고 필요한 결과를 얻으십시오.

+0

이 답변을 주셔서 감사합니다. –

+0

.get() 메소드를 사용해 주셔서 감사합니다.하지만 UI가 정지됩니다. 이처럼 becuse를 사용하는 다른 방법도 있습니다. 작동하지만 UI가 동결되어 pls를 도와줍니다. – CoronaPintu