2013-05-01 63 views
0

有人可以幫助我。我在LoadUrl和javascript方面遇到困難。LoadUrl JavaScript未加載

下面的代碼似乎在我運行2.3的舊HTC上運行正常(殺死該應用然後再次嘗試工作),但運行最新Android的Xperia Z被卡在「嘗試獲取評論」上。

的代碼被粘在部分是InjectJavaScript()其中這無法使用loadURL(我知道這個作爲onPageFinished不會被調用)。奇怪的是統計代碼的一部分工作正常,它的相同。

對不起了相當混亂的代碼...

@SuppressLint("SetJavaScriptEnabled") 
public class MyIceland extends SherlockActivity { 


    private static class FetchMyIceland extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      setDialog("Checking Farera for WoW Data....",2); 
      switch(FETCHFROMMYICELAND){ 
      case 0: //contact Farera for information. 
       Log.i("IcePlan","Farera Check/Empathica Front Page Retrieval..."); 
       MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=myiceland&store="+MainActivity.STORE; 
       try { 
        String Result = HTTPGET(); 
        if(Result.startsWith("no")){ //content for today? 
         setDialog("No WoW Data Available for Today\nAbout to contact Empathica.com....",2); 
         activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://www.iceland.empathica.com/LogonIceland.aspx");;}}); } 
        else{FETCHFROMMYICELAND = 100;} //we do have content... 
       } catch (IOException e1) {Log.i("IcePlan",e1.toString());} catch (Exception e1) {Log.i("IcePlan",e1.toString()); 
       } //we have data for today, so download and sort it. 
      break; 
      case 1: //get comments 
       setDialog("About to Contact Empathica.com for Comments....",2); 
       try {Thread.sleep(1000);} catch (InterruptedException e) {Log.i("IcePlan",e.toString());} 
       activity.runOnUiThread(new Runnable(){@Override public void run() {MyIceland.FetchFromEmpathica("http://v2.empathica.com/Reporting1/ClientReporting/LiveDataReporting.aspx?RID=1&PID=Comments&TID=1a");}}); 
       break; 
      case 2: //POST data 
       setDialog("Posting all data to Farera.com \n So we don't have to do this again today....",2); 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       try {params.add(new BasicNameValuePair("frontpage", URLEncoder.encode(FRONTPAGE, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());} 
       try {params.add(new BasicNameValuePair("comments", URLEncoder.encode(COMMENTS, "utf-8")));} catch (UnsupportedEncodingException e) {Log.e("IcePlan",e.toString());} 

       MyIceland.url = MainActivity.BASE_URL+"android_get.php?action=store_myiceland&store="+MainActivity.STORE; 
       String POST = HTTPPOST(params); 
       if(POST != null){FETCHFROMMYICELAND = 100; } 

       break; 


      } 

      return null; 
     } 
     @Override 
     protected void onPreExecute(){super.onPreExecute();} 
     @Override 
     protected void onPostExecute(Void arg0){ 

      if(FETCHFROMMYICELAND == 100) new MyIceland.DisplayMyIceland().execute(); 
      } 

    } 
    //------------------------------------------------------ 
    //----------------------------------------------------- 
    //----------------------------------------------------- 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my_iceland); 
     ctx = getApplicationContext(); 
     activity = this; 
     //webView2 = (WebView) findViewById(R.id.myIwebview2_widget); 
     /********************************************************/ 
     /****************** ABS ********************************/ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().show(); 
     // This is a workaround for http://b.android.com/15340 from 
     // http://stackoverflow.com/a/5852198/132047 

     BitmapDrawable bg = (BitmapDrawable) getResources().getDrawable(
       R.drawable.bg_striped); 
     bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); 
     getSupportActionBar().setBackgroundDrawable(bg); 

     BitmapDrawable bgSplit = (BitmapDrawable) getResources().getDrawable(
       R.drawable.bg_striped); 
     bgSplit.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); 
     getSupportActionBar().setSplitBackgroundDrawable(bgSplit); 
     /************************************************************/ 
     try { 
      ov_e = (TextView) findViewById(R.id.overall_exp_tx); 
      ov_r= (TextView) findViewById(R.id.overall_rank_tx); 
      s_e= (TextView) findViewById(R.id.storeexp_tx); 
      st_e= (TextView) findViewById(R.id.staffexp_tx); 
      t_e= (TextView) findViewById(R.id.tillexp_tx); 
      res= (TextView) findViewById(R.id.responses_tx); 
      res_r= (TextView) findViewById(R.id.resp_rank_tx); 

      MyIceland.list = (ListView) findViewById(R.id.wow_lv); // set list 
      MyIceland.adapter = new SeparatedListAdapter(ctx, false); // initialise adapter 
      //authenticate 
      CookieSyncManager.createInstance(this); 
      SetUp(); //Set up webView 
      setDialog("Loading MyIceland data...\n Please be Patient...",0); 
      new FetchMyIceland().execute(); //get data 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      Log.i("IcePlan",e.toString()); 
     } 

    } 

    private static String HTTPPOST(List<NameValuePair> params){ 
     String Resp = null; 
     try { 
      HttpClient client = new DefaultHttpClient(); 
      String postURL = MyIceland.url; 
      HttpPost post = new HttpPost(postURL); 
       //List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       //params.add(new BasicNameValuePair("user", "kris")); 
       UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8); 
       post.setEntity(ent); 
       HttpResponse responsePOST = client.execute(post); 
       HttpEntity resEntity = responsePOST.getEntity(); 
       if (resEntity != null) { 
        Resp = "not null"; 

       } 
     } catch (Exception e) { 
      Log.e("IcePlan HTTPPOST",e.toString()); 
     } 
     return Resp; 
    } 
    private static String HTTPGET() throws Exception, IOException{ 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(url); 
     HttpResponse response = client.execute(request); 
     InputStream in = response.getEntity().getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder str = new StringBuilder(); 
     String line = null; 
     while((line = reader.readLine()) != null) 
     { 
      str.append(line); 
     } 
     in.close(); 
     Log.i("IcePlan",str.toString()); 
     return str.toString(); 
    } 
    private void SetUp(){ 
     webView = (WebView) findViewById(R.id.myIwebview_widget); //load custom webview 
     webView.clearView(); //clear view of browser 
     webView.clearFormData(); //clear form data 
     webView.setNetworkAvailable(MainActivity.isOnline(ctx)); //set network state 
     webView.getSettings().setDomStorageEnabled(true); 
     webView.getSettings().setPluginsEnabled(false); //no flash 
     webView.getSettings().setJavaScriptEnabled(true); // enable javascript 
     webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
     webView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 
     webView.getSettings().setSavePassword(false); //don't show password dialog 
     webView.setVerticalScrollBarEnabled(false); //no scrolling! 
     webView.setHorizontalScrollBarEnabled(false); //no scrolling! 
     webView.getSettings().setLoadsImagesAutomatically(false); // NO Images 
     webView.getSettings().setSaveFormData(false); //Don't save form data 

     //webView.setVisibility(View.VISIBLE); 
     return; 
    } 
    private static void FetchFromEmpathica(String EmpathURL){ 

    /***************************************************** 
    * setWebViewClient to load pages 
    ***************************************************** 
    ***************************************************** 
    */ 
    webView.loadUrl(EmpathURL); 
    MyIceland.page = 0; 
    webView.setWebViewClient(new WebViewClient() { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      //Log.i("IcePlan",url); 
       view.loadUrl(url); 
       return true; 
       } 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.i("IcePlan","Starting..."); 
      super.onPageStarted(view, url, favicon); 

     } 
      @Override 
      public void onPageFinished(WebView view, String url) { 

       Log.i("IcePlan","Loaded..."); 
       switch(FETCHFROMMYICELAND){ 
       case 0: 
        if(MyIceland.page == 0){ 

         MyIceland.page=1; 
         try {Thread.sleep(500);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());} 
         view.loadUrl("javascript: {" + 
            "document.forms[0].elements['userNameBox'].value = 'xxx.xxxxx';" + 
            "setTimeout(function(){document.forms[0].elements['passwordBox'].value = 'xxxxxxx';},300);" + 
            "setTimeout(function(){document.forms[0].elements['loginButton'].click();},300); };"); 
        }else if(MyIceland.page == 1){ 
         MyIceland.page=2; 
         try {Thread.sleep(1000);}catch (InterruptedException e) {Log.e("IcePlan",e.toString());} 

         String oAuthUrl=("v2.empathica.com"); 
         if(url.indexOf(oAuthUrl) > -1) 
         { 
          Log.i("Contains","Auth URL"); 
           InjectJavaScript(view); 
         }else{view.loadUrl("javascript:{};");} 
        }else if (MyIceland.page ==2){ 
         if(MyIceland.FRONTPAGE == null){ 
         Log.i("IcePlan","Inject"); 
         InjectJavaScript(view); 
         }else{MyIceland.page=3;} 

        } 
        break; 
       case 1: 
         if(MyIceland.COMMENTS == null){ 
          Log.i("IcePlan","Inject Comments"); 
          InjectJavaScript(view); 
         }else{MyIceland.page=100;} //else end 

        break; 
       } 

       super.onPageFinished(view, url); 
      } 
     }); 
    return; 

} 



    } 
    private static void setDialog(final String msg, final int dothis){ 
     activity.runOnUiThread(new Runnable() { 
       @Override 
      public void run() { 
     switch(dothis){ 
     case 0: //set up and show 
      if (dlg == null) { 
       dlg = new ProgressDialog(activity); 
       dlg.setTitle("Loading..."); 
       dlg.setMessage(msg); 
       dlg.setCancelable(activity.isFinishing()); 
       dlg.show(); 
      } 
      break; 
     case 1: //remove and reset to null 
      if (dlg.isShowing() || dlg!=null) { 
       dlg.hide(); 
       dlg = null; 
      } 
      break; 
     case 2: 
      if (dlg.isShowing() || dlg!=null) { 
       dlg.setMessage(msg); 
      } 
     } 
       }}); 
     return; 
    } 

/********************************************************* 
* HACK - Inject Javascript to get the HTML we want! 
*********************************************************/ 
    private static void InjectJavaScript(WebView view){ 
     switch(FETCHFROMMYICELAND){ 
     case 0: //get front page 
      setDialog("Attempting to get Statistics...",2); 
     view.loadUrl("javascript:{" + 
       "var element = document.getElementById('ReportDivFPRank');"+ 
       "if (typeof(element) != 'undefined' && element != null)"+ 
       "{" + 
       "var e=document.getElementById(\"ReportDivFPCR\");"+ 
       "var content=e.innerHTML;"+ 
       "window.HTMLOUT.processHTML(content);"+// exists. 
       "}" + 
       "};"); 
     break; 
     case 1: //get comments 
      setDialog("Attempting to get Comments....",2); 
      view.loadUrl("javascript:{" + 
        "var element = document.getElementById('AddNPSDetails');"+ 
        "if (typeof(element) != 'undefined' && element != null)"+ 
        "{" + 
        "var e=document.getElementById(\"_ctl1_ReportDiv\");"+ 
        "var content=e.innerHTML;"+ 
        "window.HTMLOUT.processHTML(content);"+// exists. 
        "}" + 
        "};"); 
      break; 
     } 
     return; 
     } 
    /********************************************************* 
    * Class injected into Empathica website to get HTML 
    * Continues onto our controlling AsyncTask 
    * @author Vince 
    * 
    ********************************************************/ 
    public static class MyJavaScriptInterface 
     { 

      public void processHTML(final String html) 
      { 
       setDialog("Caught RAW data....",2); 
       if(html != ""){ 
        //MyIceland.webView2.loadDataWithBaseURL("notreal/", html, "text/htm", "utf-8",null); 
        if(FETCHFROMMYICELAND == 0){ setDialog("Retrieved Area Statistics....",2); MyIceland.FRONTPAGE = html;} 
        else if(FETCHFROMMYICELAND == 1){ setDialog("Retrieved Area Comments....",2); MyIceland.COMMENTS = html;} 
        FETCHFROMMYICELAND++; 
        new MyIceland.FetchMyIceland().execute(); 

        } 

      return; 
      } 
      } 

} 
+0

Xperia Z android是4.1.2。剛剛在Emulator 4.1.2中測試過代碼,它工作正常...... Xperia Z有什麼問題嗎? – Biosonik 2013-05-01 22:48:05

回答

0

我看到FetchFromEmpathica是怎麼回事,當你將第二頁再次調用,您再次new WebViewClient()設置web視圖,把它放在setup()方法,所以它將被調用一次。

確保您的Xperia是4.1.2,不過外觀上

Reference: JavascriptInterface methods in WebViews must now be annotated

在Android 4.2中開始提到的,你現在必須明確標註,以便與@JavascriptInterface公共方法使他們可以從託管的JavaScript訪問。請注意,這也僅在您將應用程序的minSdkVersion或targetSdkVersion設置爲17或更高時纔有效。

它添加和import android.webkit.JavascriptInterface

因此,代碼會跟上時代的到最後的版本。

 @JavascriptInterface 
     public void processHTML(final String html) 
     { 
     //code 
     }