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");
}
}
}
}
ありがとうございました、私は今、巨大な改善を作ったと思います。私のメインポストをチェックしてください。今私が持っている唯一の問題は、最初の起動時にページを読み込まないことです。なぜ見えますか? – MartijnG
ああ大丈夫、それは明らかです。しかし、(1)が終了したかどうかをどのように確認できますか? – MartijnG
あなたはチェックする必要はありません。 'view.loadUrl()'を 'AsyncTask'に移動して、あなたのウェブサイトが利用可能であることを確認したらすぐにロードします。 btwでは、 'setRequestMethod()'を使ってデフォルトの 'GET'の代わりに' HEAD'メソッドを指定するかどうかを確認する方が速いです。これはページ全体を取得します。 – lenik