2013-08-15 4 views
0

이 링크의 본문을 String HTML에 저장하고 WebView에로드하려고합니다. (코드 구문 분석은 Jsoup로 끝난다.) 버튼을 누르면 디버거가 나를 보여줍니다 String HTML = re.fixCode(); 그리고 "Debug Current Instruction Pointer"라고 말합니다.다른 클래스의 메서드/변수에 액세스 할 수 없습니다.

나는 문자열을 메서드에 전달하고 문자열을 전달하는 등 많은 작업을 시도했습니다. 그러나 똑같은 일이 반복해서 일어납니다. 내 결론은 메서드/변수를 다른 클래스로 전달하지 않는다는 것입니다. (당신이 그 마지막 비트를 이해하기를 바랍니다)

그리고 만약 내가 그들을 어떻게 액세스합니까? 의도를 통해?

그래서 몸을 가져 와서 문자열로 전달한 다음 WebView에로드하고 싶습니다. 감사!

Main 클래스

public class MainActivity extends Activity { 

    private String uri = "http://www.novasoftware.se/webviewer/%28S%28muz0tu55twfd43zkqrlejb55%29%29/design1.aspx?schoolid=18200&code=83310"; 
    private RequestTask re; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button b = (Button) findViewById(R.id.button1); 
     final WebView web = (WebView) findViewById(R.id.webView1); 
     WebSettings webSettings = web.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 



     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new RequestTask().execute(uri); 
       loadWeb(); 
      } 
     }); 

    } 

    private void loadWeb() { 
     **String HTML = re.fixCode();** 
     System.out.println(HTML); 
     //  web.loadData(re.fixedHtml, "text/html", null); 
    } 
} 

RequestTask 클래스

package com.dir.schema; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

import android.os.AsyncTask; 

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

    public String html, fixedHtml; 

    @Override 
    protected String doInBackground(String... uri) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpResponse response; 
     String responseString = null; 
     try { 
      response = httpclient.execute(new HttpGet(uri[0])); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpStatus.SC_OK){ 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       response.getEntity().writeTo(out); 
       out.close(); 
       responseString = out.toString(); 
      } else{ 
       //Closes the connection. 
       response.getEntity().getContent().close(); 
       throw new IOException(statusLine.getReasonPhrase()); 
      } 
     } catch (ClientProtocolException e) { 
      //TODO Handle problems.. 
     } catch (IOException e) { 
      //TODO Handle problems.. 
     } 
     return responseString; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     //Do anything with response.. 
     html = result; 
     fixCode(); 
    } 

    public String fixCode() { 
     Document doc = Jsoup.parse(html); 
     return fixedHtml = doc.body().toString(); 

    } 

    } 
+0

당신이 실제 오류를받을 수 있나요? 그렇다면 무엇입니까? 그것이 NPE라면'doc' 또는'doc.body()''null'입니까? 그렇지 않다면 실수로 실수로 중단 점을 설정하지 않았습니까? –

+0

@JasonC NPE doc 및 doc.body()에 값이 있습니다. 확인했습니다. 실행할 때 "이 종류의 실행은 일시 중지되었을 때 Dubug 퍼스펙티브를 여는 구성입니다." – Donald

답변

0

당신은 re.fixCode()를 호출하고 있지만 다시는 아무것도 설정되지 않았습니다. 이 시점에서 널 포인터 오류가 발생하기를 기대합니다.

나는 당신이 그렇게처럼 의 onclick() 방법을 다시하고 싶은 생각 :

public void onClick(View v) { 
    re = new RequestTask(); 
    re.execute(uri); 
    loadWeb(); 
} 
+0

참고 : 잠재적 인 경쟁 조건을 제어 할 수 있다고 가정 할 것입니까? 귀하의 ** RequestTask **가 실행을 완료하기 전에 ** loadWeb() **이 호출 될 가능성이 높습니다. 그게 문제가 될까요? –

+0

예. 문제 일 수 있습니다. 어떻게 해결합니까? Thread를 수행 한 다음 Sleep (1000)을 실행하고 RequestTask를 끝내십시오. – Donald

+0

onPostExecute()에서 loadWeb()을 호출하면 트릭을 수행 할 수 있습니다. 특히 인터넷이 걱정되는 곳에서는 경쟁을 피하기 위해 잠자는 것이 결코 좋은 생각이 아닙니다. –

관련 문제