问题描述
很新的一般的Android开发和Java,所以请原谅术语的任何业余的无知和缺乏。
Quite new to Android development and Java in general, so please excuse any amateur ignorance and lack of terminology.
我工作的一个Android应用程序,涉及到获取网页字符串,使用基于可用的。
I'm working on an Android app that involves fetching Web pages as strings, using a method based on the code available at http://www.spartanjava.com/2009/get-a-web-page-programatically-from-android/.
这需要时间小,但明显的数额,但工作正常。它是由pressing在UI按钮触发。由于应用程序没有响应,在数据被牵强,我有一个,就是在它发生之前警告用户敬酒。
This takes a small but noticeable amount of time, but works fine. It is triggered by pressing a button in the UI. Since the application is unresponsive while data is being fetched, I've got a toast that is meant to warn users before it happens.
下面基本上正在做什么(而不是实际的code,只是举例):
Here is essentially what is being done (not the actual code, just illustrative):
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方法完成后,被覆盖了由数据取自敬酒出庭很简单。
Unfortunately, The "Getting Data" toast only seems to appear after the getPage method has completed, appearing very briefly before being covered up by the "Data Retrieved" toast.
我如何避免这种情况,使得获取数据敬酒出现,那么GETPAGE方法运行,那么数据取自敬酒时,方法终止出现?
How do I avoid this, making the "Getting Data" toast appear, then the getPage method run, then the "Data Retrieved" toast appear when the method terminates?
任何建议将是多少AP preciated。我期望的解决方案涉及某种线索或同步的,但甚至不知道从哪里开始寻找一个合适的教程...
Any suggestions would be much appreciated. I expect the solution involves some kind of threads or synchronisation, but don't even know where to start looking for an appropriate tutorial...
格雷格
推荐答案
正确使用,解决你的问题的的AsyncTask
类:
correct use of an AsyncTask
class that solves your problem:
注意上preExecute
和 onPostExecute
方法之后,被称为前/你得到的页面。
notice the onPreExecute
and onPostExecute
methods which are called before/after your get the page.
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();
}
}
}
这篇关于preventing互联网访问法,从延迟举杯弹出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!