2013-11-15 31 views
0

以下是我的三個活動,問題是我在LineGraph中將Xstring的輸出變爲null。當調試它,它示出了這樣的模式:AsyncTask的doInBackground在我調用它後不能正常工作

parseStrings = mJsoupAct.getOutput(); LineGraph.java
mExecute(); jsoupAct.java
new Parsee()。​​execute(); jsoupAct.java
Log.d(「xoutputD」,output +「」); jsoupAct.java
url =「http://www.google.co.in/」; jsoupAct.java ...........

現在的問題是。爲什麼4號線5日前執行。由於執行此操作,它返回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); 
} 
} 

LineGraph

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調用該實例。這真的很難遵守你的代碼,我不認爲有必要過分複雜的東西(除非你真的必須?)

P.S.我對解釋不好,所以問我是否做得不好。

相關問題