1

总的来说,对于 Android 开发和 Java 来说都是新手,所以请原谅任何业余的无知和缺乏术语。

我正在开发一个 Android 应用程序,该应用程序使用基于http://www.spartanjava.com/2009/get-a-web-page-programatically-from-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();
}

不幸的是,“获取数据”吐司似乎仅在 getPage 方法完成后出现,在被“检索数据”吐司覆盖之前非常短暂地出现。

如何避免这种情况,使“获取数据”吐司出现,然后运行 ​​getPage 方法,然后在方法终止时出现“数据检索”吐司?

任何建议将不胜感激。我希望解决方案涉及某种线程或同步,但甚至不知道从哪里开始寻找合适的教程......

格雷格

4

2 回答 2

2

正确使用AsyncTask解决问题的类:

注意在获取页面之前/之后调用的onPreExecuteand方法。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 回答