防止Internet访问方法延迟toast弹出窗口

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方法,然后在方法终止时出现“数据检索”吐司?

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

格雷格

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

注意在获取页面之前/之后调用的onPreExecuteonPostExecute方法。

 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 { 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(); } } } 

您不应该在UI线程中执行长时间运行(即网络或磁盘I / O)操作。 您应该使用AsyncTaskThread / Handler组合。

以下是一些链接:

  • 无痛线程
  • 的AsyncTask
  • 线