Android 为什么AsyncTask没有';你不能正常工作吗?

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

我做了一些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.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