0

AsyncTaskを使用したのはこれが初めてで、機能しますが、コードをコピーして貼り付けただけなので、非常に汚れています。私はそれを正しい方法で、そして可能な限りきれいにしたいと思っています。それで、誰かが私のコードをクリーンアップするのを手伝って、それを正しい方法で行う方法を教えてもらえますか?あなたは私を助け、将来のAndroid開発でより多くの経験を私に与えることで私に大きな恩恵を与えるでしょう。私はそれを最初から正しい方法で学びたいです;)

編集: たくさんのチュートリアルを読んでビデオを見た後、私は大きな改善をしたと思います!そして、私はそれをしたことをとてもうれしく思います!しかし、残っている小さな問題は1つだけです。アプリの起動時に、ページは読み込まれません。リンクをクリックした後、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");
            }
        }
    }
}
4

1 に答える 1

1

progressDialog.dismiss();から呼び出すのではなく、代わりdoInBackground()に使用してくださいonPostExecute()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) の結果をすぐに確認しようとするため、まだ結果はありません。


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");
        }
    }
}
于 2012-05-11T04:17:09.303 に答える