두 개의 웹 페이지에서 데이터를 가져 와서 파일에 저장하려고합니다. Android (doInBackground)의 AsynkTask
에서이 모든 작업을 수행하고 있습니다. 내 에뮬레이터에서 응용 프로그램을 실행할 때 ... 런타임 오류가 발생합니다 : doInBackground` 실행하는 동안 오류가 발생했습니다. 나는 코드를 두 번이나 실행했지만 잘못 된 것 같지 않습니다. 여기에 내 코드는 ... 누군가가 나를 도와! 또한 pls이 코드를 향상시킬 수있는 방법에 대해 알려 ... 정말 지금 지루한.비동기 작업을 실행하는 동안 오류가 발생했습니다.
public class OpeningActivity extends Activity {
static final String PAGE_URL = "http://www.facebook.com/pages/Symbiosis-College-of- Arts-Commerce-Confession/524808617560510";
static String title, imgSource, viewFormLink, viewFormEntry, formResponse, data;
static PrintWriter writer, formWriter, dfWriter;
static FileInputStream fis;
static File dataFile, confessionsPage, formFile;
Button setup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_opening);
setup = (Button) findViewById(R.id.btnSetup);
setup.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new getWebPage().execute(PAGE_URL);
}
});
}
public class getWebPage extends AsyncTask<String, Integer, String> {
protected void onPreExecute(String f) {
// TODO Setting up variables
f = "whatevs";
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
DefaultHttpClient urlClient = new DefaultHttpClient();
HttpGet getHtml = new HttpGet(PAGE_URL);
ResponseHandler<String> resHandler = new BasicResponseHandler();
try {
String htmlPage = urlClient.execute(getHtml, resHandler);
lod.d("htmlpage", htmplPage);
confessionsPage = new File("ConfessionsPage.html");
confessionsPage.createNewFile();
writer = new PrintWriter(confessionsPage, "UTF-8");
writer.print(htmlPage.replace("<!--", "").replace("-->", ""));
writer.flush();
writer.close();
Document doc = Jsoup.parse(confessionsPage, "UTF-8", "http://www.facebook.com/");
title = doc.title().substring(0, doc.title().length() - 11);
Elements imgSRC = doc.select("img[src$=.jpg]");
for (Element element : imgSRC) {
if (element.attr("class").equals("profilePic img")) {
imgSource = element.attr("src");
}
}
Elements links = doc.select("a[href*=google]");
viewFormLink = null;
for (Element element : links) {
viewFormLink = element.attr("href");
}
viewFormLink = viewFormLink.replace("http://www.facebook.com/l.php?u=", "");
int ampLOC = viewFormLink.indexOf("&");
viewFormLink = viewFormLink.substring(0, ampLOC);
viewFormLink = URLDecoder.decode(viewFormLink, "UTF-8");
formResponse = viewFormLink.substring(0, (viewFormLink.length() - 8));
formResponse = formResponse + "formResponse";
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DefaultHttpClient formClient = new DefaultHttpClient();
HttpGet getForm = new HttpGet(viewFormLink);
ResponseHandler<String> resHandler2 = new BasicResponseHandler();
try {
String formPage = formClient.execute(getForm, resHandler2);
formFile = new File("FormPage.html");
formFile.createNewFile();
formWriter.write(formPage);
formWriter.flush();
formWriter.close();
Document doc2 = Jsoup.parse(formFile, "UTF-8", "http://www.facebook.com");
Elements entry = doc2.select("textarea[name^=entry]");
viewFormEntry = entry.attr("name");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dataFile = new File("DataFile");
try {
dataFile.createNewFile();
dfWriter = new PrintWriter(dataFile);
dfWriter.println(title);
dfWriter.println();
dfWriter.println(imgSource);
dfWriter.println();
dfWriter.println(viewFormLink);
dfWriter.println();
dfWriter.println(viewFormEntry);
dfWriter.println();
dfWriter.println(formResponse);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fis = new FileInputStream(dataFile);
byte [] dataArray = new byte [fis.available()];
while (fis.read() != -1) {
data = new String(dataArray);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
@Override
protected void onProgressUpdate(Integer... progress) {
// TODO Auto-generated method stub
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Bundle dataBundle = new Bundle();
dataBundle.putString("mydata", result);
Intent intent = new Intent(OpeningActivity.this, Main.class);
intent.putExtras(dataBundle);
startActivity(intent);
}
}
}
코드를 약간 변경했습니다. 이제 doInBackground에 데이터 문자열 변수를 반환합니다. 매니페스트 파일에 인터넷 권한을 추가했습니다. 여전히 같은 오류가 발생합니다. 여기 내 오류 로그는 편의를 위해 다음과 같습니다 : 당신은 빈 "새로운"변수와 반환 값이없는이 initalization
DefaultHttpClient urlClient = new DefaultHttpClient();
HttpGet getHtml = new HttpGet();
ResponseHandler<String> resHandler = new BasicResponseHandler();
String htmlPage = urlClient.execute(getHtml, resHandler);
에 어떤 변수를 지정하지 않은
05-27 10:36:25.995: E/AndroidRuntime(741): FATAL EXCEPTION: AsyncTask #1
05-27 10:36:25.995: E/AndroidRuntime(741): java.lang.RuntimeException: An error occured while executing doInBackground()
05-27 10:36:25.995: E/AndroidRuntime(741): at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-27 10:36:25.995: E/AndroidRuntime(741): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.lang.Thread.run(Thread.java:856)
05-27 10:36:25.995: E/AndroidRuntime(741): Caused by: java.lang.NullPointerException
05-27 10:36:25.995: E/AndroidRuntime(741): at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496)
05-27 10:36:25.995: E/AndroidRuntime(741): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:626)
05-27 10:36:25.995: E/AndroidRuntime(741): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
05-27 10:36:25.995: E/AndroidRuntime(741): at org.social.myconfessions.OpeningActivity$getWebPage.doInBackground(OpeningActivity.java:68)
05-27 10:36:25.995: E/AndroidRuntime(741): at org.social.myconfessions.OpeningActivity$getWebPage.doInBackground(OpeningActivity.java:1)
05-27 10:36:25.995: E/AndroidRuntime(741): at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-27 10:36:25.995: E/AndroidRuntime(741): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-27 10:36:25.995: E/AndroidRuntime(741): ... 4 more
전체 오류 로그 – bakriOnFire
도 제공하십시오. 왜 "result"를 onPostExecute에서 사용해야합니까? 너 인터넷 사용 허가? – Blackbelt
doInBackground에서 반환하는 값은 onPostExecute (이 경우 문자열 결과)에서 매개 변수로 가져올 값입니다. 문제를 해결하고 더 나아질 지 확인하십시오. –