使用AsyncTask传递一个值
我一直在研究这个问题,而且我碰到了一个我不知道该怎么做的地方。 我想要做的是使用一个类下载并parsing出一个文件到一个string,然后将该string发送到另一个类来parsing出JSON的东西。 所有的部分都自行工作,我已经单独testing了一切。 我只是不知道如何将值发送到Jsonparsing来开始parsing。
所以这是我的filedownloader类。
public class JsonFileDownloader extends AsyncTask<String, Void, String> { //used to access the website String username = "admin"; String password = "admin"; public String ret = ""; @Override protected String doInBackground(String... params) { Log.d("Params ", params[0].toString()); readFromFile(params[0]); return ret; } private String readFromFile(String myWebpage) { HttpURLConnection urlConnection = null; try { //Get the url connection URL url = new URL(myWebpage); Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); } }); urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); if (inputStream != null) { ret = streamToString(inputStream); inputStream.close(); Log.d("Final String", ret); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } return ret; } } public static String streamToString(InputStream is) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); String line; while ((line = rd.readLine()) != null) { sb.append(line); } return sb.toString(); } public String getJsonData() { return ret; }
}
这工作正常,我已经testing了一遍又一遍没有错误。 接下来是这样的Jsonparsing器。
public class JSONParser { JSONObject jsonResponse; String jsonData; //Consturctor public JSONParser() { //this.jsonData = jsonData; // this.OutputData = outPutData; } public void parsesData(String promo, ArrayList<String> pictureHTTP, ArrayList<String> pathHTTP, ArrayList<String> labelText) throws IOException { //Build the Json String JsonFileDownloader jfd = new JsonFileDownloader(); // jsonData = String.valueOf(jfd.execute(promo)); jfd.execute(promo); //jfd.getResuts(jsonData); //jsonData = jfd.ret; Log.d("JsonData String = " , jsonData); //Try to parse the data try { Log.d("Jsondata " , jsonData); //Creaate a new JSONObject ith the name/value mapping from the JSON string jsonResponse = new JSONObject(jsonData); //Returns the value mapped by the name if it exists and is a JSONArry JSONArray jsonMainNode = jsonResponse.optJSONArray(""); //Proccess the JSON node int lenghtJsonArrar = jsonMainNode.length(); for (int i = 0; i<lenghtJsonArrar; i++) { //Get object for each json node JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); //Get the node values //int song_id = Integer.parseInt(jsonChildNode.optString("song_id").toString()); String picture = jsonChildNode.optString("picture").toString(); String pathName = jsonChildNode.optString("path").toString(); String lableName = jsonChildNode.optString("label".toString()); //Debug Testing code pictureHTTP.add(picture); pathHTTP.add(pathName); labelText.add(lableName); } } catch (JSONException e) { e.printStackTrace(); } }
现在我知道问题出在哪里。 当我尝试为jsonData赋值时,它永远不会被分配,所以它是空的,系统失败。 我在jfd.exicute()之后尝试了一些东西,但是我只是不知道如何从最终的string输出获取值到jsonData中。 感谢您的帮助。
好的,这里是一个非常灵活的模式,用于使用AsyncTask下载Web内容并从中获取结果返回到UI线程。
第1步定义一个接口,将充当AsyncTask和您想要的数据之间的消息总线。
public interface AsyncResponse<T> { void onResponse(T response); }
第2步创build一个通用的AsyncTask扩展,将采取任何url,并从中返回结果。 你基本上已经有了,但是我做了一些调整。 最重要的是,允许设置AsyncResponsecallback接口。
public class WebDownloadTask extends AsyncTask<String, Void, String> { private AsyncResponse<String> callback; // Optional parameters private String username; private String password; // Make a constuctor to store the parameters public WebDownloadTask(String username, String password) { this.username = username; this.password = password; } // Don't forget to call this public void setCallback(AsyncResponse<String> callback) { this.callback = callback; } @Override protected String doInBackground(String... params) { String url = params[0]; return readFromFile(url); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if (callback != null) { callback.onResponse(s); } else { Log.w(WebDownloadTask.class.getSimpleName(), "The response was ignored"); } } /******* private helper methods *******/ private String streamToString(InputStream is) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); String line; while ((line = rd.readLine()) != null) { sb.append(line); } return sb.toString(); } private String readFromFile(String myWebpage) { String response = null; HttpURLConnection urlConnection = null; try { //Get the url connection URL url = new URL(myWebpage); // Unnecessary for general AsyncTask usage /* Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password.toCharArray()); } }); */ urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); if (inputStream != null) { response = streamToString(inputStream); inputStream.close(); Log.d("Final String", response); } } catch (IOException e) { e.printStackTrace(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } return response; } }
第3步出现并使用该AsyncTask无论你想要的。 这是一个例子。 请注意,如果您不使用setCallback
,则将无法获取来自AsyncTask的数据。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebDownloadTask task = new WebDownloadTask("username", "password"); task.setCallback(new AsyncResponse<String>() { @Override public void onResponse(String response) { // Handle response here. Eg parse into a JSON object // Then put objects into some list, then place into an adapter... Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); } }); // Use any URL, this one returns a list of 10 users in JSON task.execute("http://jsonplaceholder.typicode.com/users"); } }