我正在尝试使用多线程方法下载Web内容 . 我正在关注一个在线android开发教程服务,所以我知道相信我的代码是正确的(完整的android web开发人员课程第5章) . 但是,按照要求在日志中显示部分网页后,我收到消息:
“I / Choreographer:跳过743帧!应用程序可能在其主线程上做了太多工作 . ”
我正在使用AsynTask但仍然没有运气 .
public class MainActivity extends AppCompatActivity {
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) { /
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try{
url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
data = reader.read();
}
return result;
}
catch(Exception e) {
e.printStackTrace();
return "Failed";
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DownloadTask task = new DownloadTask();
String result = null;
try {
result = task.execute("http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Log.i("Contents of URL", result);
}
}
1 回答
好吧,如果你直接在
onCreate()
方法中调用AsyncTask.get()
方法,那么你有点作弊,因为代码实际上是在UI线程中执行的!你真的不能调用get(),因为这将等待结果,从而阻止UI线程(这正是你想要避免的)
我猜你这样做是因为你想在你的onCreate()方法中得到结果,但你做不到 .
通常,您需要在UI字段中显示结果(如TextView) . 在这种情况下,您应该使用
Handler
实例再次使用UI线程中的值 .更正代码: