2012-05-10 9 views
0

AsyncTaskを初めて使用しても機能しますが、コードをコピーして貼り付けただけでは非常に汚いです。私はそれを正しい方法で、できるだけきれいにしたい。だから誰も私のコードをきれいにして、正しい方法で私に教えてくれますか?あなたは私を助けて、将来のAndroidの開発にもっと多くの経験を与えてくれることに大いに賛成します。チュートリアルの束を読んで、私は大幅に改善したと思うビデオのを見た後 :)AsyncTaskのクリーンアップと使い方のヒント

EDITを、私はそれを最初から正しい方法を勉強したいです!そして私はそれをやったことをとてもうれしく思います!しかし、小さな問題が残っているだけです。アプリの起動時に、ページを読み込まない。 shouldOverrideUrlLoadingはリンクをクリックした後にうまく動作しますが、起動時には空白の画面しか表示されません。どうしたの?

public class WebviewActivity extends MainActivity { 

    private WebView myWebView; 
    private ProgressDialog progressDialog; 
    private boolean mConnection = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final ScrollView mainScrollView = (ScrollView)findViewById(R.id.ScrollView01); 

     myWebView = (WebView)findViewById(R.id.webview); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 

     myWebView.setWebViewClient(new WebViewClient(){ 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       new checkConnection().execute(); 
       if (mConnection == true){ 
        view.loadUrl(url); 
       }   
       return true;     
      } 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       mainScrollView.fullScroll(ScrollView.FOCUS_UP); 
      } 
     }); 

     myWebView.requestFocus(View.FOCUS_DOWN); 
     myWebView.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_UP: 
         if (!v.hasFocus()) { 
          v.requestFocus(); 
         } 
         break; 
       } 
       return false; 
      } 
     }); 
    } 

    @Override 
    public void onResume() { 
     super.onResume();  
     new checkConnection().execute(); 
     if (mConnection == true){ 
      myWebView.loadUrl(webLink); 
     } 
    } 

    //------------------------------------------------------ 
    //-----DOING THE CONNECTION CHECK IN ANOTHER THREAD----- 
    //------------------------------------------------------ 

    public class checkConnection extends AsyncTask<Void, Void, Void>{ 

     int mStatusCode = 0; 
     Exception mConnectionException; 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute();   
      progressDialog = ProgressDialog.show(WebviewActivity.this, "", "Loading...", true); 
      progressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

       if (cm.getActiveNetworkInfo().isConnectedOrConnecting()) { 
        URL url = new URL(webLink); 
        HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
        urlc.setConnectTimeout(1000 * 5); // mTimeout is in seconds 
        urlc.connect(); 

        mStatusCode = urlc.getResponseCode(); 

        if (mStatusCode == 200){ 
         //Nothing to do. 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       mConnectionException = e; 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void param){ 
      progressDialog.dismiss(); 

      if (mStatusCode == 200){ 
       mConnection = true; 
      } 
      else if (mStatusCode == 404){ 
       myWebView.loadUrl("file:///android_asset/errorpage404.html"); 
      } 
      else { 
       myWebView.loadUrl("file:///android_asset/errorpage.html"); 
      } 
     } 
    } 
} 

答えて

1

、代わりにonPostExecute()を使用し、doInBackground()からprogressDialog.dismiss();を呼び出さないでください。 doInBackground()はUIスレッドではないので、UI要素を操作しようとすると荒い結果になる可能性があります。

あなたのページが最初の試行でロードされません理由はここにあります:

 public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      new checkConnection().execute(); <- (1) 
      if (mConnection == true){   <- (2) 
       view.loadUrl(url); 
      }   
      return true;     

(1)を開始し、将来 にいくつかの時間を終了されようとしている非同期タスクは、(2)にしようとします(1)すぐにの結果を確認してください。まだ結果はありません。ここ


がパラメータとしてURLを受け入れ、あなたのAsyncTaskのバージョンを、変更されています:

public class checkConnection extends AsyncTask<String, Void, String>{  <------ change this 

    int mStatusCode = 0; 
    Exception mConnectionException; 

    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute();   
     progressDialog = ProgressDialog.show(WebviewActivity.this, "", "Loading...", true); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(String... params) {  <------ change this 
     try { 
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

      if (cm.getActiveNetworkInfo().isConnectedOrConnecting()) { 
       URL url = new URL(webLink); 
       HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
       urlc.setConnectTimeout(1000 * 5); // mTimeout is in seconds 
       urlc.connect(); 

       mStatusCode = urlc.getResponseCode(); 

       if (mStatusCode == 200){ 
        //Nothing to do. 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      mConnectionException = e; 
     } 
     return params[0];  <------ change this 
    } 

    @Override 
    protected void onPostExecute(String param){  <------ change this 
     progressDialog.dismiss(); 

     if (mStatusCode == 200){ 
      myWebView.loadUrl(param);  <------ change this 
     } 
     else if (mStatusCode == 404){ 
      myWebView.loadUrl("file:///android_asset/errorpage404.html"); 
     } 
     else { 
      myWebView.loadUrl("file:///android_asset/errorpage.html"); 
     } 
    } 
} 
+0

ありがとうございました、私は今、巨大な改善を作ったと思います。私のメインポストをチェックしてください。今私が持っている唯一の問題は、最初の起動時にページを読み込まないことです。なぜ見えますか? – MartijnG

+0

ああ大丈夫、それは明らかです。しかし、(1)が終了したかどうかをどのように確認できますか? – MartijnG

+0

あなたはチェックする必要はありません。 'view.loadUrl()'を 'AsyncTask'に移動して、あなたのウェブサイトが利用可能であることを確認したらすぐにロードします。 btwでは、 'setRequestMethod()'を使ってデフォルトの 'GET'の代わりに' HEAD'メソッドを指定するかどうかを確認する方が速いです。これはページ全体を取得します。 – lenik

関連する問題