Listview从Json文件异步加载图片,参考网上的例子改良加了点击可跳转网页功能。但是发现,Listview读Json,有时显的很慢,等几秒都没载进数据。还黑屏网上看到可用AsyncTask加载可加快。请问怎加AsyncTask在我的Listveiw上让加载Json加入载入中效果,请问怎加快载入优化?代码打包下载:http://www.apkbus.com/android-95420-1-1.html[AsyncListImage.java package cn.wangmeng.test; import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class AsyncListImage extends Activity {
static final String KEY_TITLE = "text";
static final String KEY_ARTIST = "webInfo"; private ListView list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个线程来处理下载文件操作
final ImageLoadingDialog dialog = new ImageLoadingDialog(this);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
// 两秒后关闭后dialog
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
}, 1000 * 5); new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = 0;
//获取歌曲列表
msg.obj = getListView();
handler.sendMessage(msg);
}
}).start();
}
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
case 0 :
list=(ListView)findViewById(R.id.list2);
List<ImageAndText> dataArray=new ArrayList<ImageAndText>();
try {
dataArray = JsonService.getJson();
} catch (Exception e) {
System.out.println("新闻载入失败");
e.printStackTrace();
}
//ImageAndTextListAdapter adapter=new ImageAndTextListAdapter(this, dataArray, list);
ImageAndTextListAdapter adapter = new ImageAndTextListAdapter(AsyncListImage.this,dataArray, list,new String[] {KEY_TITLE, KEY_ARTIST}, new int[] {R.id.text,R.id.text2});
list.setAdapter(adapter);
list.setOnItemClickListener(new ListViewItemOnClickListener());
break;
}
}
};
class ListViewItemOnClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//String name = list.get(position).getLat()+","+list.get(position).getLon(); //String text = ((TextView) view.findViewById(R.id.text)).getText().toString();
String webInfo = ((TextView) view.findViewById(R.id.text2)).getText().toString();
//String imageUrl = ((TextView) view.findViewById(R.id.image)).getText().toString();
//String imageUrl = ((ImageView) view.findViewById(R.id.image)).getContext().toString();
Intent intent = new Intent(getApplicationContext(), myBrowserActivity.class);
//intent.putExtra(KEY_TITLE, text);
//Intent intent=new Intent();
//intent.setAction("mybrowser");
//intent.putExtra("myurl", "webInfo2");
intent.putExtra(KEY_ARTIST,webInfo );
startActivity(intent); } }
private ListView getListView() {
// TODO Auto-generated method stub
return null;
} } JsonService.java
package cn.wangmeng.test;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
public class JsonService
{
public static List<ImageAndText> getJson() throws Exception
{
//向服务器端拿取数据 //URL url=new URL("http://www.gdsjx.com/photo/logo.txt");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
InputStream inStream=conn.getInputStream();
byte[] data = new byte[4096];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int count = -1;
while((count = inStream.read(data,0,4096)) != -1) {
outStream.write(data,0,count);
}
String StringData=new String(outStream.toByteArray());
System.out.println("StringData");
//http://code.google.com/p/googlegetOutputStream().write(StringData.toString().getBytes("UTF-8"));
//setContentType("text/json; charset=UTF-8"); //JSON的类型为text/json
//一,JSON解析,前提是:服务器端发送JSON数据格式的东西,就用JSON来解析
List<ImageAndText> listbean=JsonService.getImageAndTexts(StringData);
return listbean;
//二,采用XML来解析得到服务器端的数据,就像解析平常解析XML数据一样,前提是服务器端发送XML数据
}private static void setContentType(String string) {
// TODO Auto-generated method stub
}
private static ByteArrayOutputStream getOutputStream() {
// TODO Auto-generated method stub
return null;
}
public static List<ImageAndText> getImageAndTexts(String jsondata) throws Exception //JSON解析方式
{
//JSON数据格式 [{"id":"1","name":"admin","longtime":"40"},{"id":"1","name":"admin","longtime":"40"}]
List<ImageAndText> listBean=new ArrayList<ImageAndText>();
//先把jsondata这个字符串转换成一个数组
JSONArray jsonarray=new JSONArray(jsondata);
for(int i=0;i<jsonarray.length();i++)
{
//再把数组的第i项转换成一个json对象。
JSONObject jsonobj=jsonarray.optJSONObject(i);
//重json对象里面取值
String url=jsonobj.getString("url");
String webInfo=jsonobj.getString("webInfo");
//String webName=new String(buffer,"gbk");
//String webName=jsonobj.getString("webName");
String webName=jsonobj.optString("webName","gbk");
//把取到的值添加对bean中,并且把bean对象给保存起来
ImageAndText testbean=new ImageAndText(url,webName,webInfo);
listBean.add(testbean);
//给test重新赋值一下
testbean=null;
}
return listBean;
}
}
listview json
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class AsyncListImage extends Activity {
static final String KEY_TITLE = "text";
static final String KEY_ARTIST = "webInfo"; private ListView list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个线程来处理下载文件操作
final ImageLoadingDialog dialog = new ImageLoadingDialog(this);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
// 两秒后关闭后dialog
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
}, 1000 * 5); new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = 0;
//获取歌曲列表
msg.obj = getListView();
handler.sendMessage(msg);
}
}).start();
}
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
case 0 :
list=(ListView)findViewById(R.id.list2);
List<ImageAndText> dataArray=new ArrayList<ImageAndText>();
try {
dataArray = JsonService.getJson();
} catch (Exception e) {
System.out.println("新闻载入失败");
e.printStackTrace();
}
//ImageAndTextListAdapter adapter=new ImageAndTextListAdapter(this, dataArray, list);
ImageAndTextListAdapter adapter = new ImageAndTextListAdapter(AsyncListImage.this,dataArray, list,new String[] {KEY_TITLE, KEY_ARTIST}, new int[] {R.id.text,R.id.text2});
list.setAdapter(adapter);
list.setOnItemClickListener(new ListViewItemOnClickListener());
break;
}
}
};
class ListViewItemOnClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//String name = list.get(position).getLat()+","+list.get(position).getLon(); //String text = ((TextView) view.findViewById(R.id.text)).getText().toString();
String webInfo = ((TextView) view.findViewById(R.id.text2)).getText().toString();
//String imageUrl = ((TextView) view.findViewById(R.id.image)).getText().toString();
//String imageUrl = ((ImageView) view.findViewById(R.id.image)).getContext().toString();
Intent intent = new Intent(getApplicationContext(), myBrowserActivity.class);
//intent.putExtra(KEY_TITLE, text);
//Intent intent=new Intent();
//intent.setAction("mybrowser");
//intent.putExtra("myurl", "webInfo2");
intent.putExtra(KEY_ARTIST,webInfo );
startActivity(intent); } }
private ListView getListView() {
// TODO Auto-generated method stub
return null;
} } JsonService.java
package cn.wangmeng.test;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
public class JsonService
{
public static List<ImageAndText> getJson() throws Exception
{
//向服务器端拿取数据 //URL url=new URL("http://www.gdsjx.com/photo/logo.txt");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
InputStream inStream=conn.getInputStream();
byte[] data = new byte[4096];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int count = -1;
while((count = inStream.read(data,0,4096)) != -1) {
outStream.write(data,0,count);
}
String StringData=new String(outStream.toByteArray());
System.out.println("StringData");
//http://code.google.com/p/googlegetOutputStream().write(StringData.toString().getBytes("UTF-8"));
//setContentType("text/json; charset=UTF-8"); //JSON的类型为text/json
//一,JSON解析,前提是:服务器端发送JSON数据格式的东西,就用JSON来解析
List<ImageAndText> listbean=JsonService.getImageAndTexts(StringData);
return listbean;
//二,采用XML来解析得到服务器端的数据,就像解析平常解析XML数据一样,前提是服务器端发送XML数据
}private static void setContentType(String string) {
// TODO Auto-generated method stub
}
private static ByteArrayOutputStream getOutputStream() {
// TODO Auto-generated method stub
return null;
}
public static List<ImageAndText> getImageAndTexts(String jsondata) throws Exception //JSON解析方式
{
//JSON数据格式 [{"id":"1","name":"admin","longtime":"40"},{"id":"1","name":"admin","longtime":"40"}]
List<ImageAndText> listBean=new ArrayList<ImageAndText>();
//先把jsondata这个字符串转换成一个数组
JSONArray jsonarray=new JSONArray(jsondata);
for(int i=0;i<jsonarray.length();i++)
{
//再把数组的第i项转换成一个json对象。
JSONObject jsonobj=jsonarray.optJSONObject(i);
//重json对象里面取值
String url=jsonobj.getString("url");
String webInfo=jsonobj.getString("webInfo");
//String webName=new String(buffer,"gbk");
//String webName=jsonobj.getString("webName");
String webName=jsonobj.optString("webName","gbk");
//把取到的值添加对bean中,并且把bean对象给保存起来
ImageAndText testbean=new ImageAndText(url,webName,webInfo);
listBean.add(testbean);
//给test重新赋值一下
testbean=null;
}
return listBean;
}
}
listview json
另外即使线程操作,如果来一条数据你就handle一次UI刷新,那界面肯定还是会很卡,所以你要考虑批量处理,或者像有些同学说的分页处理,或者当只去请求你当前显示的那些列表项