问题描述
|
我有一个问题,我确定它确实很容易解决,但是我仍在开始开发应用程序,因此我认为您可以为我提供帮助。
我有一个带有货币转换器的应用程序,当我按下按钮进行转换时,它会冻结,同时它从互联网上获取数据,然后在几秒钟后恢复正常。这是代码:
public void capturaConversao(String m1,String m2) throws ClientProtocolException,IOException {
BufferedReader resp = null;
endereco = \"http://download.finance.yahoo.com/d/quotes.csv?s=\" + m1
+ m2 + \"=X&f=sl1d1t1ba&e=.csv\";
try {
HttpClient client = new DefaultHttpClient();
HttpGet method = new HttpGet(endereco);
HttpResponse statusCode = client.execute(method);
resp = new BufferedReader(new InputStreamReader(statusCode
.getEntity().getContent()));
StringBuffer sb = new StringBuffer(\"\");
String line = \"\";
while ((line = resp.readLine()) != null) {
sb.append(line);
}
resp.close();
String result = sb.toString();
String[] values = result.split(\",\");
conversion = values[1];
nextstep++;
} finally {
if (resp != null) {
try {
resp.close();
} catch (IOException e) {
e.printstacktrace();
Toast.makeText(getBaseContext(),\"Não foi possível se conectar à internet.\",Toast.LENGTH_SHORT).show();
}
}
}
}
解决方法
AsyncTask是几乎所有UI线程问题的解决方案。 :)
这是一个简短的教程。
, 您可能是从UI线程调用的,您不应该这样做。因为UI线程忙于连接到Internet,所以它使UI锁定。这是进行此类呼叫的教程。
, 您的UI线程的可用周期已被HTTP操作所占用。用
Thread
或AsyncTask
分开
, 是的,我也同意使用AsyncTask解决方案,因为它被称为无痛线程,所以用户无需理会线程管理。
对于您的情况,只需在doInBackground()内部调用capturaConversao()方法(即在doInBackground方法内部执行从Web进行的所有数据获取操作),然后在onPostExecute()内部调用display方法(即在内部执行所有显示操作,例如显示获取的值) listview或textview)。