以下是我的三个活动,问题是我在LineGraph中作为Xstring的输出得到null。当我调试它时,它显示如下模式:
parseStrings = mJsoupAct.getOutput();的 LineGraph.java
mExecute();的 jsoupAct.java
new Parsee()。execute();的 jsoupAct.java
Log.d(“xoutputD”,输出+“”);的 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;
}
}
答案 0 :(得分:2)
我找到了路。实际上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;
}
答案 1 :(得分:0)
据我所见,你误解了AsyncTask的作用。它在后台异步工作,所以它不会等待它下面的代码的下一行。如果要从doInBackground中检索内容,请使用onPostExecute。这可以在你的Parsee课程中重写。看,它会在doInBackground完成后触发。此外,onPostExecute在主线程(UI)上执行,因此您可以从那里通过UI执行任何操作。
而且,只是一个友好的建议 - 使用AsyncTask获取一个类并从onCreate调用该实例。跟你的代码真的很难,我认为没有必要过度复杂化(除非你真的必须这样做?)
P.S。我不好解释,所以请问我是否做得很差。