记录Android学习过程中遇到的问题

  Android编程中经常会使用到ArrayAdapter、SimpleAdapter、BaseAdapter。其中ArrayAdapter、SimpleAdapter较为简单,定制效果少,而BaseAdapter使用的非常普遍。

 1 asyncHttpClient.get(Constants.HEALTHY_NEWS_LIST,new AsyncHttpResponseHandler() {
 2             @Override
 3             public void onSuccess(int i, Header[] headers, byte[] bytes) {
 4                 try {
 5                     String str = new String(bytes,"gb2312");
 6                     Document document = Jsoup.parse(str);
 7                     Element body = document.body();
 8                     Elements tdWidth = body.select("td[width=500]");
 9                     Elements tdHeight = tdWidth.select("td[height=40]");
10                     Elements links = tdHeight.select("a");
11                     for (Element link : links){
12                         String title = link.text();
13                         String url = link.attr("href");
14                         healthy = new Healthy();
15                         healthy.setTitle(title);
16                         healthy.setUrl(url);
17                         healthyList.add(healthy);
18                     }
19                     HealthyAdapter healthyAdapter = new HealthyAdapter(HealthyActivity.this,healthyList);
20                     pullToRefreshListView.setAdapter(healthyAdapter);
21                     pullToRefreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
22                         @Override
23                         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
24                             String title = healthyList.get((int)id).getTitle();
25                             String url = healthyList.get((int)id).getUrl();
26                             Intent intent = new Intent(HealthyActivity.this,HealthyDetailActivity.class);
27                             intent.putExtra("url",url);
28                             startActivity(intent);
29                         }
30                     });
31                     Elements link_more = body.select("a[href^=http://health.enorth.com.cn/system/more/]");
32                    textView.setText(link_more.attr("href"));
33                 }catch (IOException e){
34                     Log.d("file read exception : ", e.getMessage());
35                 }
36
37             }
38
39             @Override
40             public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
41                 Toast.makeText(HealthyActivity.this, "请检查网络连接", Toast.LENGTH_SHORT).show();
42                 Log.d("asyncHttpClient fail : ",throwable.getMessage());
43             }
44         });

这段代码使用了AsynHttpClient的get()方法去获得一个页面的字节流。AsyncHttpClient是我之前导入其他开源项目jar包的时候无意中导入android-async-http-x.x.x.jar的,根据它的一个命名我猜想它是用来多线程发起http请求,在网上阅读了相关博客之后,其实就是HttpClient和new Runnable的一个封装,这样使得它可以直接在主线程中进行,不过与AsyncTask相比,缺点就是无法控制网络连接过程中OnPreExecute()的一个处理。对于返回字节流乱码的问题,阅读了网页源码之后发现它的编码方式为gb2312,这是一种在大陆经常使用的汉字编码,据说可以显示98%左右的汉字。设置字符的编码方式为:String str = new String(bytes,"gb2312")。网页代码为html语言(超文本标记语言),在我看来其实跟xml一样是一种标记性语言,其中java 5之后提供了一个工具类htmlParse用来解析html文本,不过之后很少进行更新而且比较复杂所以使用的就很少了。Jsoup则是网上非常流行html解析框架,在网络爬虫方面使用的非常多。大概的使用就是用各种tag去解析文本。底层应该是使用了编译原理的状态机的一些知识,编译原理我学习的不好,这里也说不出什么了。今天早上遇到了一个很大的问题就是往HealthyList中add(healthy),我使用了Log将解析出来的title和url打印出来,在加入之后也将healthy打印出来,在for循环结束之后,我手动将healthy依次Log打印出来,非常奇怪的是居然最后一次打印出来的全是相同的值,这让我迷惑了很久。后来在同学的启发之下,我发现每次循环都要new一个healthy对象既可以解决问题。之前我之所以不在循环中每次都new一个healthy对象是因为我觉得这样会节省内存,结果反而招致这样的问题,其实往深层次分析还是对JAVA中对象的值传递和引用(地址)传递不清晰所导致的。之后我阅读了这篇博客,关于这一点讲的非常详细。http://6924918.blog.51cto.com/6914918/1283761 其中可以总结为两点,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会发生变化的。Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份给参数。其中mldnjava视频是有专门对这个的讲解的,不过好像是我遗忘了。所以在我没有在for循环中new一个对象的时候,他每次都将healthy对象的地址的拷贝存放在HealthyList中,每次循环打印出来的都是正确的内容,但是当执行到最后一次循环的时候,地址中存放的对象是最后一次的内容,而这个内容的地址被拷贝了n次,并且都存放在了HealthyList中,所以最后我进行手工打印的时候出现的都是最后一次加入的内容,而且在我打印HelathyList的时候,打印出来的地址都是相同的,但是当时我居然没有想到这个问题,我当时想的居然是每次new一个新对象太占内存,看来JAVA的基础真的很重要。

时间: 2024-12-14 18:46:38

记录Android学习过程中遇到的问题的相关文章

android 学习过程中登陆失效的个人理解

今天在学习的过程中,要做登陆失效的功能,所以就找了些资料,好好看了一下,研究了一番,慢慢的做出来了! 比如:你在一个手机端登陆了账号,在另外的一个手机端也登陆了账号,此时,前一个手机端的账号会提示登陆失效. 意思是只能存在一个账号,这个其实不是很难. 每次登陆的时候会存在一个Token,每次登陆的Token是不一样的! 下面贴一下前端的一些小代码: 在异步网络请求里面判断返回的异常是否是登陆失效: @Override protected void onPostExecute(BusinessRe

Android 学习过程中遇到的知识点

以下是学习中记录的一些个人认为需要掌握的知识点,由于偶是从零开始学习的,所以有经难的朋友们可以直接忽略此部分: Intent 用法: 1 Uri myUri = Uri.parse ("http://www.flashwing.net"); 2 Intent openBrowserIntent = new Intent(Intent.ACTION_VIEW ,myUri); 3 startActivity(openBrowserIntent); 4 5 6 Intent openWel

写点什么...记录一下学习过程中的心路历程

讲真"好脑子比不上烂笔头"这句话让我产生了深深的认同感... Python自学已经一个多月了,天天在视频,书本的连环轰炸下,稀里糊涂的记住了不少的东西,摆脱了看代码两眼一抹黑的尴尬境遇.各种结构惊奇的代码,看起来也有一种似曾相识的感觉,让人不禁有一种错觉"我似乎是会编程了!!!""我是个天才!!!"...... 还总有人说编程难,我看也没什么嘛,这不是一个月就能搞定了嘛.走起,直接搞起来.依稀记得视频中有过几个实例,那我也来自己实现一下. 打开之

Android学习过程中遇到的问题

1.使用在Activity布局之上重叠显示操作栏,第一次使用出现错误信息. 错误信息如下:java.lang.RuntimeException:Ubable to start activity ComponentInfo(****.MainActivity):android.util.AndroidRuntimeException:requestFeature() must be called before adding Content. 以下代码是MainActivity的onCreate方法

个人Android学习过程中问题及解决办法汇总

首先,你可能不小心看到了这一篇--没错,对Android开发我完全首次接触--所以遇到的问题都很简单的--(大部分解决办法摘选自stackoverflow) 一 忘截图了,新建项目后,没动任何代码,却各种保存.好吧,是因为SDK下载的不完全,比如默认的新建项目是Android 2.2的,然而我只下载了Android 4.0到6.0的--所以只用到Android SDK Manager上下载就好了,或者直接将默认的Minimum Required SDK设置成已经下载好的,比如我这里是4.0. 二

Android JNI中记录log

Android JNI中是有提供相关的接口来记录log的,这样的话,和java写的代码一样,可以直接在logcat中查看.如果代码里都是android提供的log api,一旦遇到新的需求,改起来会很麻烦,每个地方都需要修改,所以说封装android提供的log api是很有必要的. android提供的常用api __android_log_write(ANDROID_LOG_INFO, "tag here", "message here"); __android

Linux以及Android开发中的小技巧和长繁命令记录收集

不断更新收集中.... 2014071743 ssh以nx_guest的身份登录到172.24.221.137,然后在172.24.221.137与172.24.61.252的8080端口建立网络连接,同时创建端口为5678的本地代理服务 ssh -C -f -N -o 'TCPKeepAlive=yes' -L 5678:172.24.61.252:8080 [email protected] 反编译android下的二进制程序 ./prebuilts/gcc/linux-x86/arm/ar

转 Android学习笔记: 学习过程中碰到的一些问题及解决方法

在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描述:在res文件中新增的变量不能在R.java中实时的显示出来. 解决方法:选择菜单栏的“Project”,勾选“Build Automatically”选项. 2.LogCat视窗没有显示 问题描述:在Eclipse的右下方没有显示LogCat视窗. 解决方法:选择菜单栏的“Windows”,再选

在Android studio中如何把项目放到远程git或从远程git得到项目:

主要记录了在Android studio 中如何把项目放到远程git或从远程得到项目: 因为它已经为我们提供了git插件,所有我们部署一下就可以直接使用了.方法如下: 1.准备:先下载window上的git(在不同的系统下载不同的git),然后安装. 2.在Android studio 里点击:File->Settings(如图1),然后进入Version Control->Git;(如图二)然后点击Test(出现图三表示成功). 图1 图二 图三 3.初始化git项目(git init),操