2013-11-15 1 views
0

여기에 세 가지 액티비티가 있습니다. 문제는 LineGraph에서 Xstring의 출력으로 null이 발생합니다. 디버그 할 때 다음과 같은 패턴이 표시됩니다.AsyncTask의 doInBackground가 호출 된 후 정확히 작동하지 않습니다

parseStrings = mJsoupAct.getOutput(); LineGraph.java
mExecute(); jsoupAct.java
새로운 Parsee(). execute(); jsoupAct.java
Log.d ("xoutputD", output + ""); jsoupAct.java
url = "http://www.google.co.in/"; 4 라인이 5 일 전에 실행되는 이유는 jsoupAct.java ...........

이제 문제는 ...입니다. 이 실행으로 인해 null을 반환하고 doInBackground을 실행합니다. 왜 이런 일이 일어나고있는거야 ???

MainActivity

public class MainActivity extends Activity { 
jsoupAct mJsoupAct = new jsoupAct(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.d("xmain", "main"); 

    Intent i = new Intent(getApplicationContext(), LineGraph.class); 
    startActivity(i); 
} 
} 

선 그래프

public class LineGraph extends Activity { 
String parseStrings; 
jsoupAct mJsoupAct; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mJsoupAct = new jsoupAct(); 
    Xparse(); 
} 
public void Xparse() { 
    parseStrings = mJsoupAct.getOutput(); 
    Log.d("xstring", parseStrings + ""); 
} 
} 

jsoupAct 최대한 멀리 볼 수

public class jsoupAct extends Activity { 
public String output; 
public String url; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

public void mExecute() { 
    new Parsee().execute(); 

} 

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

    protected String doInBackground(String... params) { 
     try { 
      url = "http://www.google.co.in/"; 
      Document doc = Jsoup.connect(url).get(); 
      String body = doc.body().text(); 
      output = body.toString(); 
      Log.d("xoutputD0", output + ""); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
     return output; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(output); 
     Log.d("xoutputD1", output + ""); 
    } 
} 

public String getOutput() { 
    mExecute(); 
    Log.d("xoutputD", output + ""); 
    return output; 
} 

public void setOutput(String output) { 
    this.output = output; 
} 
} 

답변

1

나는 길을 발견했다. 사실 Jsoup는 스레드에서 병렬로 스레드를 기다리는 시간이 더 많이 걸리며 실행을 계속 유지하므로 출력으로 null을 반환합니다. 그래서 이것을 극복하기 위해 메인 스레드에 잠을 더했습니다 JsoutAct.java 및 whhooooppp .. 완료 됨

public String getOutput() { 
     mExecute(); 
     Log.d("xoutputD2", output + ""); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return output; 
    } 
0

, 당신은 misunder있어 서있는 무엇 AsyncTask 않습니다. 백그라운드에서 비동기 적으로 작동하므로 코드 바로 다음 행을 기다리지 않습니다. doInBackground에서 항목을 검색하려면 onPostExecute를 사용하십시오. 그것은 당신의 클래스 Parsee에서 재정의 될 수 있습니다. DoInBackground가 끝나면 실행됩니다. 또한 onPostExecute는 메인 스레드 (UI)에서 실행되므로 UI에서 원하는대로 무엇이든 할 수 있습니다.

친숙한 조언 - AsyncTask로 하나의 클래스를 만들고 onCreate에서 해당 인스턴스를 호출하십시오. 당신의 코드를 따르기가 정말로 어려웠고, 당신이 정말로 필요하지 않는 한, 그것을 복잡하게하는 것이 필요하다고 생각하지 않습니다. 나는 설명이 좋지 않으므로 내가 가난한 일을하는지 물어보십시오.

관련 문제