【发布时间】:2015-08-26 16:27:46
【问题描述】:
我正在寻求帮助,以便我可以在另一个班级获得ArrayList<String>。正如您在下面的代码中看到的那样,我有内部和外部类。两者都按预期工作,并且我都能够使用 php 脚本从我的在线数据库中插入值和获取详细信息(为了代码清晰,我已经注释掉了这些详细信息,因为它占用了大量空间)。
public class ServerRequests {
ProgressDialog progressDialog;
public static final int CONNECTION_TIMEOUT = 15000;
public static final String SERVER_ADDRESS = "// my url domain";
public ArrayList<String> list1 = new ArrayList<>();
public ServerRequests(Context context)
{
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setTitle("Processing");
progressDialog.setMessage("Please wait..");
}
public void storeDataInBackground(MultiChallenge multiChallenge)
{
progressDialog.show();
new StoreDataAsyncTask(multiChallenge).execute();
}
public class StoreDataAsyncTask extends AsyncTask<Void , Void , Void>
{
MultiChallenge multiChallenge;
public StoreDataAsyncTask(MultiChallenge multiChallenge)
{
this.multiChallenge = multiChallenge;
}
@Override
protected Void doInBackground(Void... voids) {
// where I insert values...
@Override
protected void onPostExecute(Void aVoid) {
progressDialog.dismiss();
super.onPostExecute(aVoid);
Log.d("ServerRequests", "Post execute");
}
}
public ArrayList<String> fetchDataInBackground() {
progressDialog.show();
new FetchDataAsyncTask().execute();
return list1;
}
public class FetchDataAsyncTask extends AsyncTask<Void, Void, ArrayList<String>>
{
public FetchDataAsyncTask()
{
}
String text = "";
@Override
protected ArrayList<String> doInBackground(Void... params) {
InputStream is1;
HttpParams httpRequestParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpRequestParams, CONNECTION_TIMEOUT);
HttpClient client = new DefaultHttpClient(httpRequestParams);
HttpPost post = new HttpPost(// my url domain+ "// php script");
try {
HttpResponse httpResponse = client.execute(post);
is1 = httpResponse.getEntity().getContent();
BufferedReader reader;
reader = new BufferedReader(new InputStreamReader(is1, "iso-8859-1"), 8);
String line = null;
while ((line = reader.readLine()) != null) {
text += line + "\n";
}
is1.close();
JSONArray data = new JSONArray(text);
for (int i = 0; i < data.length(); i++) {
Log.d("GetNames", data.getString(i));
JSONObject jsonData = data.getJSONObject(i);
list1.add( // I successfully add details to list1 here, I have commented it out for code clarity);
}
for (int iterate = 0; iterate < list1.size(); iterate++) {
Log.d("list1", list1.get(iterate));
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
// catch (JSONException e) {e.printStackTrace();}
return list1;
}
@Override
protected void onPostExecute(ArrayList<String> myList) {
progressDialog.dismiss();
super.onPostExecute(myList);
}
}
}
现在我已成功添加到 list1(我可以告诉它添加了值,因为带有 int 迭代的 for 循环),我现在需要将它发送到另一个类,我将把项目放在 @ 987654324@。这是我在类中的代码,我想在其中显示从ServerRequests 获得的ArrayList 的详细信息:
ServerRequests serverRequests = new ServerRequests(DisplayInfo.this);
ArrayList<String> myList = new ArrayList<>();
myList = serverRequests.fetchDataInBackground();
for (int iterate = 0; iterate < myList.size(); iterate++) {
Log.d("Display", myList.get(iterate));
然而,上面的 for 循环从未被调用,这表明myList 从未被提供list1 设法在FetchDataAsync 类的doInBackground 方法中获取的详细信息。
请注意,在提出这个问题之前,我确实花了几个小时尝试从 SO 得出的各种想法和答案。提前感谢大家的帮助。
【问题讨论】:
-
它很可能正确地获取数据,但由于它是异步的,循环在完成之前被调用。您应该在异步任务的
onPostExecute中运行循环 -
虽然我接受将其放入 onPostExecute 方法会实现更可靠的实现,但仍然确认所有数据都放置在 list1 ArrayList 中,因为我能够确认这一点通过使用 Logcat。不过,我感谢您的帮助,并打算实施您的建议。供您参考,我能够实现 Varsha 的答案并且它成功运行。感谢您的帮助。
标签: android json arraylist android-asynctask