Android,Web Services,AsyncTask请帮助一个菜鸟/确保我正确的开始

时间:2012-03-08 21:17:09

标签: java android oop android-asynctask

我已经对orignal post进行了编辑 我正在创建一个连接到JSON API的Android应用程序。到目前为止一切正常,除非服务器有延迟。如果需要太长时间,UI当然可以停止响应。我读过asynctask可以解决我的问题。不过我已经有了很多例子。

这是进行http调用的restclient类...解析json并将自定义对象存储到我的其他类可以访问的公共列表中。

package com.bde.dgcr;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class RestClient {
static List<ResponseHolder> list = new ArrayList<ResponseHolder>();
protected Context context = this.context;

private static String convertStreamToString(InputStream is) {
    /*
       * To convert the InputStream to String we use the BufferedReader.readLine()
       * method. We iterate until the BufferedReader return null which means
       * there's no more data to read. Each line will appended to a StringBuilder
       * and returned as String.
       */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return sb.toString();
}


/* This is a test function which will connects to a given
  * rest service and prints it's response to Android Log with
  * labels "Praeda".
  */
public void  connect(String url) {


    AsyncTask<String, Void, Void> connection = new AsyncTask<String, Void, Void>() {
        protected Context context;
        @Override
        protected Void doInBackground(String... params) {
// Prepare a request object
            HttpGet httpget = new HttpGet(params[0]);

// Execute the request
            HttpResponse response;
            HttpClient httpclient = new DefaultHttpClient();
            try {
                list.clear();
                response = httpclient.execute(httpget);
                // Examine the response status
                Log.i("Praeda", response.getStatusLine().toString());

                // Get hold of the response entity
                HttpEntity entity = response.getEntity();
                // If the response does not enclose an entity, there is no need
                // to worry about connection release

                if (entity != null) {

                    // A Simple JSON Response Read
                    InputStream instream = entity.getContent();
                    String result = convertStreamToString(instream);

                    // A Simple JSONObject Creation
                    //JSONObject json= new JSONObject(result);
                    JSONArray jsonArray = new JSONArray(result);


                    // A Simple JSONObject Parsing
                    for (int i = 0; i < (jsonArray.length()); i++) {
                        JSONObject json_obj = jsonArray.getJSONObject(i);
                        ResponseHolder rh = new ResponseHolder(json_obj);
                        list.add(rh);
                    }


                    instream.close();

                }

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
             ListView listView1;


            super.onPostExecute(aVoid);    //To change body of overridden methods use       File | Settings | File Templates.
            ResponseHolderAdapter adapter = new ResponseHolderAdapter(context, R.layout.listview_item_row, RestClient.list);
            listView1 = (ListView) findViewById(R.id.listView1);

            View header = (View)         getLayoutInflater().inflate(R.layout.listview_header_row, null);
            listView1.addHeaderView(header);

            listView1.setAdapter(adapter);
        }
    };
    connection.execute(url);

}
}

这是调用静态连接方法的类,并使用适配器列表进入列表视图。

public class JsonGrabber extends Activity {


private final String API_KEY = "key";
private final String SECRET = "secret";
private String state;
private String city;
private String country;
private static String mode;
private String md5;
private String url;
CourseSearch cs;
private ListView listView1;

/**
 * Called when the activity is first created.
 */


public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.results);
    Bundle extras = getIntent().getExtras();
    state = extras.getString("state");
    city = URLEncoder.encode(extras.getString("city"));
    country = extras.getString("country");
    mode = extras.getString("mode");
    md5 = MD5.getMD5(API_KEY + SECRET + mode);
    System.out.println(md5);
    url = "http://www.api.com/?key=" + API_KEY + "&mode=" + mode + "&id=1&sig=" + md5;
    String findByLocUrl = "http://www.api.com/?key=" + API_KEY + "&mode=" + mode + "&city=" + city + "&state=" + state + "&country=" + country + "&sig=" + md5;
    System.out.println(findByLocUrl);
    RestClient rc = new RestClient();
    rc.connect(findByLocUrl);
    //RestClient.connect(findByLocUrl);
/*        if (RestClient.list.isEmpty())
    {
        setContentView(R.layout.noresults);
    }     else
    {

    ResponseHolderAdapter adapter = new ResponseHolderAdapter(this, R.layout.listview_item_row, RestClient.list);
    listView1 = (ListView) findViewById(R.id.listView1);

    View header = (View) getLayoutInflater().inflate(R.layout.listview_header_row, null);
    listView1.addHeaderView(header);

    listView1.setAdapter(adapter);
    }

 */
}


}

不知怎的,我应该将所有这些网格化为使用扩展asyctask的内部类来在后台进行API调用解析json添加到我的列表并设置适配器。我知道我可能有一些面向对象的问题,并希望在我继续使用我的应用程序之前,你们可以确保我朝着正确的方向前进。我还有一些我没有包含的课程。如果我添加了其他课程,请告诉我是否更有意义。在此先感谢你们/女孩们可能提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用AsyncTask重写您的连接方法,如下所示:

public static void connect(String url) {

HttpClient httpclient = new DefaultHttpClient();

AsyncTask<String, Void, Void> connection = new AsyncTask<String, Void, Void>() {

@Override
protected Void doInBackground(String... params) {
// Prepare a request object
HttpGet httpget = new HttpGet(params[0]);

// Execute the request
HttpResponse response;
try {
    list.clear();

    response = httpclient.execute(httpget);
    // Examine the response status
    Log.i("Praeda", response.getStatusLine().toString());

    // Get hold of the response entity
    HttpEntity entity = response.getEntity();
    // If the response does not enclose an entity, there is no need
    // to worry about connection release

    if (entity != null) {

        // A Simple JSON Response Read
        InputStream instream = entity.getContent();
        String result= convertStreamToString(instream);

    // A Simple JSONObject Creation
    //JSONObject json= new JSONObject(result);
    JSONArray jsonArray = new JSONArray(result);


    // A Simple JSONObject Parsing
    for (int i = 0; i < (jsonArray.length()); i++) {
        JSONObject json_obj = jsonArray.getJSONObject(i);
        ResponseHolder rh = new ResponseHolder(json_obj);
        list.add(rh);
    }


     instream.close();
    }
    }
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

connection.execute(url);
}

答案 1 :(得分:0)

如果你想做得对,你应该使用内容提供者,服务和数据库,这是一个很好的教程:

http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/