Android 为什么AsyncTask没有';你不能正常工作吗?
我做了一些JSON解析器,我想在同一个ListView中显示信息。我尝试使用AsynkTask,但它不起作用 对于ListView,我创建了从ArrayAdapter扩展的简单类Plase和Adapter 这是我的代码:Android 为什么AsyncTask没有';你不能正常工作吗?,android,android-asynctask,Android,Android Asynctask,我做了一些JSON解析器,我想在同一个ListView中显示信息。我尝试使用AsynkTask,但它不起作用 对于ListView,我创建了从ArrayAdapter扩展的简单类Plase和Adapter 这是我的代码: import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.widge
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
public class ListActivity extends Activity {
private static final String API_START = "http://api.yelp.com/business_review_search?location=";
private static final String API_END = "&ywsid=mlNrKepTs01H6gB0yoIWrw";
private String mRequestURL = "http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
public static ArrayAdapter<Place> mAdapter = null;
private ListView mListView;
ArrayList<Place> arrayList = new ArrayList<Place>();
ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
if (mRequestURL == null) {
mRequestURL ="http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
}
if (mAdapter==null && mRequestURL!=null) {
new DownloadFilesTask().execute(mRequestURL, null, null);
mAdapter = new Adapter(ListActivity.this, arrayList);
}
mListView = (ListView) findViewById(R.id.list);
mListView.setAdapter(mAdapter);
}
private class DownloadFilesTask extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(ListActivity.this);
dialog.setMessage("Please wait");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
protected Void doInBackground(String... urls) {
try {
arrayList = parse(mRequestURL);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return(null);
}
@Override
protected void onPostExecute(Void places) {
dialog.dismiss();
}
}
private ArrayList<Place> parse(String u) throws IOException, ParseException {
URL url = new URL(u);
StringBuilder sb = new StringBuilder();
URLConnection yc = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String s;
while ((s=in.readLine()) != null)
sb.append(s);
in.close();
JSONParser parser = new JSONParser();
Object o = parser.parse(sb.toString());
JSONObject jsonObject1 = (JSONObject) o;
JSONArray jsonArray = (JSONArray) jsonObject1.get("businesses");
for(int i=0; i<jsonArray.size(); i++) {
JSONObject obj = (JSONObject) jsonArray.get(i);
URL photo_url = new URL((String) obj.get("photo_url"));
URL place_url = new URL((String) obj.get("url"));
String name = (String) obj.get("name");
String address = obj.get("city") + " " + obj.get("address1");
long latitude = Long.parseLong((String) obj.get("latitude"));
long longitude = Long.parseLong((String) obj.get("longitude"));
arrayList.add(new Place(photo_url, name, address, place_url, latitude, longitude));
}
File file = new File("File.txt");
ObjectOutputStream oout = new ObjectOutputStream(openFileOutput("File.txt" , 0));
oout.writeObject(arrayList);
oout.close();
return arrayList;
}
}
导入android.app.Activity;
导入android.app.ProgressDialog;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入org.json.simple.JSONArray;
导入org.json.simple.JSONObject;
导入org.json.simple.parser.JSONParser;
导入org.json.simple.parser.ParseException;
导入java.io.*;
导入java.net.URL;
导入java.net.URLConnection;
导入java.util.ArrayList;
公共类ListActivity扩展了活动{
私有静态最终字符串API_START=”http://api.yelp.com/business_review_search?location=";
私有静态最终字符串API_END=“&ywsid=mlNrKepTs01H6gB0yoIWrw”;
专用字符串mRequestURL=”http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
公共静态ArrayAdapter mAdapter=null;
私有列表视图;
ArrayList ArrayList=新的ArrayList();
进程对话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
if(mRequestURL==null){
mRequestURL=”http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
}
if(mAdapter==null&&mRequestURL!=null){
新建DownloadFilesTask().execute(mRequestURL,null,null);
mAdapter=新适配器(ListActivity.this,arrayList);
}
mListView=(ListView)findViewById(R.id.list);
mListView.setAdapter(mAdapter);
}
私有类DownloadFilesTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
dialog=新建ProgressDialog(ListActivity.this);
setMessage(“请稍候”);
对话框。setUndeterminate(true);
对话框。可设置可取消(true);
dialog.show();
}
受保护的Void doInBackground(字符串…URL){
试一试{
arrayList=parse(mRequestURL);
}捕获(IOE异常){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}捕获(解析异常){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}
返回(空);
}
@凌驾
受保护的void onPostExecute(作废位置){
dialog.dismise();
}
}
私有ArrayList解析(字符串u)抛出IOException,ParseException{
URL=新URL(u);
StringBuilder sb=新的StringBuilder();
URLConnection yc=url.openConnection();
BufferedReader in=新的BufferedReader(新的InputStreamReader(yc.getInputStream());
字符串s;
而((s=in.readLine())!=null)
某人追加;
in.close();
JSONParser=新的JSONParser();
objecto=parser.parse(sb.toString());
JSONObject JSONObject 1=(JSONObject)o;
JSONArray JSONArray=(JSONArray)jsonObject1.get(“业务”);
对于(int i=0;i检查纬度
和经度
,可能是其双
非长
double latitude = obj.getDouble("latitude");
double longitude = obj.getDouble("longitude");
和在onPostExecute()方法中将适配器设置为listview…
@Override
protected void onPostExecute(Void places) {
dialog.dismiss();
mAdapter = new Adapter(ListActivity.this, arrayList);
mListView = (ListView) findViewById(R.id.list);
mListView.setAdapter(mAdapter);
}
检查纬度
和经度
,可能是它的双倍
不长
double latitude = obj.getDouble("latitude");
double longitude = obj.getDouble("longitude");
和在onPostExecute()方法中将适配器设置为listview…
@Override
protected void onPostExecute(Void places) {
dialog.dismiss();
mAdapter = new Adapter(ListActivity.this, arrayList);
mListView = (ListView) findViewById(R.id.list);
mListView.setAdapter(mAdapter);
}
您应该将mListView.setAdapter(mAdapter);
放入onPostExecute()
原因是doInBackground()
启动了一个新线程,该线程在设置列表适配器时可能无法完成。onPostExecute()
与UI线程同步,以便您可以修改GUI元素
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
mListView = (ListView) findViewById(R.id.list);
if (mRequestURL == null) {
mRequestURL ="http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
}
if (mAdapter==null && mRequestURL!=null) {
new DownloadFilesTask().execute(mRequestURL, null, null);
}
}
private class DownloadFilesTask extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(ListActivity.this);
dialog.setMessage("Please wait");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
protected Void doInBackground(String... urls) {
try {
arrayList = parse(mRequestURL);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return(null);
}
@Override
protected void onPostExecute(Void places) {
mAdapter = new Adapter(ListActivity.this, arrayList);
mListView.setAdapter(mAdapter);
dialog.dismiss();
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
mListView=(ListView)findViewById(R.id.list);
if(mRequestURL==null){
mRequestURL=”http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
}
if(mAdapter==null&&mRequestURL!=null){
新建DownloadFilesTask().execute(mRequestURL,null,null);
}
}
私有类DownloadFilesTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
dialog=新建ProgressDialog(ListActivity.this);
setMessage(“请稍候”);
对话框。setUndeterminate(true);
对话框。可设置可取消(true);
dialog.show();
}
受保护的Void doInBackground(字符串…URL){
试一试{
arrayList=parse(mRequestURL);
}捕获(IOE异常){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}捕获(解析异常){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}
返回(空);
}
@凌驾
受保护的void onPostExecute(作废位置){
mAdapter=新适配器(ListActivity.this,arrayList);
mListView.setAdapter(mAdapter);
dialog.dismise();
}
}
您应该将mListView.setAdapter(mAdapter);
放入onPostExecute()
原因是doInBackground()
启动了一个新线程,该线程在设置列表适配器时可能无法完成。onPostExecute()
与UI线程同步,以便您可以修改GUI元素
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
mListView = (ListView) findViewById(R.id.list);
if (mRequestURL == null) {
mRequestURL ="http://api.yelp.com/business_review_search?location=New%20York&ywsid=mlNrKepTs01H6gB0yoIWrw";
}
if (mAdapter==null && mRequestURL!=null) {
new DownloadFilesTask().execute(mRequestURL, null, null);
}
}
private class DownloadFilesTask extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(ListActivity.this);
dialog.setMessage("Please wait");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
protected Void doInBackground(String... urls) {
try {
arrayList = parse(mRequestURL);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return(null);
}
@Override
protected void onPostExecute(Void places) {
mAdapter = new Adapter(ListActivity.this, arrayList);
mListView.setAdapter(mAdapter);
dialog.dismiss();
}
}
@覆盖
创建时受保护的空(Bun