0

두 개의 웹 페이지에서 데이터를 가져 와서 파일에 저장하려고합니다. 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 
+1

전체 오류 로그 – bakriOnFire

+0

도 제공하십시오. 왜 "result"를 onPostExecute에서 사용해야합니까? 너 인터넷 사용 허가? – Blackbelt

+0

doInBackground에서 반환하는 값은 onPostExecute (이 경우 문자열 결과)에서 매개 변수로 가져올 값입니다. 문제를 해결하고 더 나아질 지 확인하십시오. –

답변

0

;

이 시도 :

DefaultHttpClient urlClient = new DefaultHttpClient(); 
HttpGet getHtml = new HttpGet(PAGE_URL); 
ResponseHandler<String> resHandler = new BasicResponseHandler(); 

PS을 : 당신은 출력의 내용을 원하는 경우 디버그 메시지/로그 캣 메시지가 예를 들어

Log.d("String Identifier", String_Variable); 사용해보십시오 보여주고 싶은 경우 문자열 변수 htmlPage을 다음과 같이 변경하십시오.

Log.d("htmlPage", htmlPage);

+0

감사합니다. 어리석은 실수 였어! 추신 : lod 디버깅 메시지를 보내 주셔서 감사합니다! 그들은 나를 많이 도울 것입니다. 새로운 오류가 발생했습니다 : @java line : 76. 'Java.net.IOException. 읽기 전용 파일 시스템 '입니다. 그게 무슨 뜻인지 모르겠다. pls 도움이됩니다. 감사합니다 – SynerFlow

+0

내 라인 76입니다 : confessionsPage.createNewFile(); – SynerFlow

+0

안드로이드 파일 시스템이 좀 더 복잡하기 때문에 파일 경로를 지정해야한다고 생각합니다. 다음과 같이 파일을 지정해야합니다 :'new File (getApplicationContext.getFilesDir(), "filename");' – reidzeibel

관련 문제