1

Android 開発と Java については一般的にまったく新しいので、素人の無知と用語の欠如を許してください。

http://www.spartanjava.com/2009/get-a-web-page-programatically-from-androidで入手可能なコードに基づくメソッドを使用して、Web ページを文字列としてフェッチする Android アプリに取り組んでいます。 / .

これには、わずかですがかなりの時間がかかりますが、問題なく動作します。UI のボタンを押すとトリガーされます。データのフェッチ中はアプリケーションが応答しないため、発生する前にユーザーに警告するためのトーストを用意しました。

これは基本的に行われていることです(実際のコードではなく、単なる説明です):

public void buttonPressed(View view) 
{
   Toast.makeText(this, "Getting Data!", Toast.LENGTH_LONG).show();

   //See the page linked above for the code in this function!
   String page = getPage("http://www.google.com/");

   Toast.makeText(this, "Data Retrieved!", Toast.LENGTH_LONG).show();
}

残念ながら、"Getting Data" トーストは、getPage メソッドが完了した後にのみ表示され、"Data Retrieved" トーストで覆われる前に非常に短時間表示されます。

これを回避するにはどうすればよいですか?「Getting Data」トーストを表示してから getPage メソッドを実行し、メソッドの終了時に「Data Retrieved」トーストを表示しますか?

どんな提案でも大歓迎です。解決策にはある種のスレッドまたは同期が含まれると思いますが、適切なチュートリアルをどこから探し始めればよいかさえわかりません...

グレッグ

4

2 に答える 2

2

AsyncTask問題を解決するクラスの正しい使用:

onPreExecuteページを取得する前/後に呼び出されるおよびメソッドに注意しonPostExecuteてください。

public class HomeActivity extends Activity {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.home);
    }
    public void buttonPressed(View view) {
        new MyAsyncTask(this).execute(new String[] {"http://google.com/"});
    }
    private class MyAsyncTask extends AsyncTask<String, Void, String> {
        private Context context;
        public MyAsyncTask(Context context) {
            this.context = context;
        }
        @Override
        protected String doInBackground(String... params) {
            String page = getPage(params[0]);
                    //do any more work here that may take some time- like loading remote data from a web server, etc
            return page;
        }
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Toast.makeText(context, "Data Retrieved: " + result, Toast.LENGTH_LONG).show();
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast.makeText(context, "Getting Data!", Toast.LENGTH_LONG).show();
        }
    }
}
于 2011-01-28T14:56:42.140 に答える
1

UI スレッドで長時間 (つまり、ネットワークまたはディスク I/O) 操作を実行するべきではありません。AsyncTaskまたはThread/のHandler組み合わせを使用する必要があります。

ここにいくつかのリンクがあります:

于 2011-01-28T13:29:04.850 に答える