2012-05-10 4 views
0

Это первый раз, когда я использовал AsyncTask, и он работает, но он очень грязный, поскольку я только что скопировал и вставил какой-то код. Я хочу сделать это правильно и как можно чище. Так может ли кто-нибудь помочь мне с очисткой моего кода и рассказать мне, как это сделать правильно? Вы бы оказали мне большую услугу, помогая мне и давая мне больше опыта в будущем развитии Android. Я хочу узнать это правильный путь с самого начала;)Советы по очистке и использованию AsyncTask Android

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

Пожалуйста, не называйте progressDialog.dismiss(); от doInBackground(), используйте onPostExecute() вместо этого. doInBackground() не является потоком пользовательского интерфейса, поэтому попытка манипулирования элементами пользовательского интерфейса может дать вам дикие последствия.

Вот почему вы не получаете вашу страницу загружается с первой попытки:

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

(1) начинает асинхронную задачу, которая собирается завершить какое-то время в будущем (2) пытается проверьте результаты (1) сразу, так что результатов пока нет.


здесь это модифицированную версию AsyncTask, который принимает URL в качестве параметра:

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', поэтому он загружается, как только вы проверили свой сайт. и, кстати, быстрее проверить, используете ли вы 'setRequestMethod()' для указания метода 'HEAD', а не по умолчанию' GET', который извлекает всю страницу. – lenik

Смежные вопросы