从AsyncTask类返回数据

如何从AsyncTask中获取数据?我的MainActivity正在调用触发AsyncTask的DataCall.getJSON函数,但是我不确定如何将数据返回到原始Activity。

String state_data =  DataCall.getJSON(spinnerURL,spinnerContentType);

public class DataCall extends Activity {

private static final String TAG = "MyApp";

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {

protected String doInBackground(String... urls) {

String response = "";

for (String url : urls) {

DefaultHttpClient client = new DefaultHttpClient();

HttpGet httpGet = new HttpGet(url);

try {

HttpResponse execute = client.execute(httpGet);

InputStream content = execute.getEntity().getContent();

BufferedReader buffer = new BufferedReader(

new InputStreamReader(content));

String s = "";

while ((s = buffer.readLine()) != null) {

response += s;

}

} catch (Exception e) {

e.printStackTrace();

}

}

return response;

}

protected void onPostExecute(String result) {

//THIS IS WHERE I NEED TO RETURN MY DATA TO THE MAIN ACTIVITY. (I am guessing)

}

}

public void getJSON(String myUrlString, String contentType) {

DownloadWebPageTask task = new DownloadWebPageTask();

task.execute(new String[] { "http://www.mywebsite.com/" + myUrlString });

}

}

回答:

对我来说,关键是创建一个名为URLWithParams的类或其他类,因为AsyncTask将只允许发送一种类型的输入,并且我需要URL和HTTP请求的参数。

public class URLWithParams {

public String url;

public List<NameValuePair> nameValuePairs;

public URLWithParams()

{

nameValuePairs = new ArrayList<NameValuePair>();

}

}

然后将其发送到JSONClient:

public class JSONClient extends AsyncTask<URLWithParams, Void, String> {

private final static String TAG = "JSONClient";

ProgressDialog progressDialog ;

GetJSONListener getJSONListener;

public JSONClient(GetJSONListener listener){

this.getJSONListener = listener;

}

@Override

protected String doInBackground(URLWithParams... urls) {

return connect(urls[0].url, urls[0].nameValuePairs);

}

public static String connect(String url, List<NameValuePair> pairs)

{

HttpClient httpclient = new DefaultHttpClient();

if(url == null)

{

Log.d(TAG, "want to connect, but url is null");

}

else

{

Log.d(TAG, "starting connect with url " + url);

}

if(pairs == null)

{

Log.d(TAG, "want to connect, though pairs is null");

}

else

{

Log.d(TAG, "starting connect with this many pairs: " + pairs.size());

for(NameValuePair dog : pairs)

{

Log.d(TAG, "example: " + dog.toString());

}

}

// Execute the request

HttpResponse response;

try {

// Prepare a request object

HttpPost httpPost = new HttpPost(url);

httpPost.setEntity(new UrlEncodedFormEntity(pairs));

response = httpclient.execute(httpPost);

// Examine the response status

Log.i(TAG,response.getStatusLine().toString());

BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));

String json = reader.readLine();

return json;

} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

@Override

protected void onPostExecute(String json ) {

getJSONListener.onRemoteCallComplete(json);

}

public interface GetJSONListener {

public void onRemoteCallComplete(String jsonFromNet);

}

}

然后从我的主班这样叫

public class BookCatalog implements GetJSONListener {

private final String TAG = this.getClass().getSimpleName();

private String catalog_url = "URL";

private void getCatalogFromServer() {

URLWithParams mURLWithParams = new URLWithParams();

mURLWithParams.url = catalog_url;

try {

JSONClient asyncPoster = new JSONClient(this);

asyncPoster.execute(mURLWithParams);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

@Override

public void onRemoteCallComplete(String jsonBookCatalogList) {

Log.d(TAG, "received json catalog:");

Log.d(TAG, jsonBookCatalogList);

JSONObject bookCatalogResult;

try {

bookCatalogResult = (JSONObject) new JSONTokener(jsonBookCatalogList).nextValue();

JSONArray books = bookCatalogResult.getJSONArray("books");

if(books != null) {

ArrayList<String> newBookOrdering = new ArrayList<String>();

int num_books = books.length();

BookCatalogEntry temp;

DebugLog.d(TAG, "apparently we found " + Integer.toString(num_books) + " books.");

for(int book_id = 0; book_id < num_books; book_id++) {

JSONObject book = books.getJSONObject(book_id);

String title = book.getString("title");

int version = book.getInt("price");

}

}

} catch (JSONException e) {

e.printStackTrace();

}

}

}

以上是 从AsyncTask类返回数据 的全部内容, 来源链接: utcz.com/qa/406758.html

回到顶部