防止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
类来解决您的问题:
注意在获取页面之前/之后调用的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 { 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)操作。 您应该使用AsyncTask
或Thread
/ Handler
组合。
以下是一些链接:
- 无痛线程
- 的AsyncTask
- 线
- 尝试从DatePicker DialogFragment设置EditText的文本
- 适用于Android的I-Phone VM
- Android Camera API – 强制关闭不会释放相机资源
- 在AppWidget上更新TextView文本大小
- 如何在Switch的右侧设置文本位置(如CheckBox)
- 安装了最新的JDK 1.8.0,但我的Javac -version仍然显示旧版本(Windows 7 – 64)
- 错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:导入RSA公钥时出错标记
- 如何为多人Android应用程序设置Java服务器和数据库
- 如何正确获取android.net.Uri的文件大小?