【问题标题】:Get an Arraylist from an inner class从内部类获取 Arraylist
【发布时间】: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


【解决方案1】:

在 onPostExecute 方法中调用调用类中的一个函数

@Override
protected void onPostExecute(ArrayList<String> myList) {
    progressDialog.dismiss();
    super.onPostExecute(myList);
    MainActivity.sendStrings(myList);

}

在调用函数中实现一个方法:

public static void sendStrings(ArrayList<String> strings)
{
  //Add for loop here
}

或者,您也可以使用接口。在 onPostExecute 中调用接口并在调用类中实现接口

【讨论】:

  • 这是一个非常有见地的答案,因为它提供了另一种看待问题的方式(在 DisplayInfo 类中实现静态字段)。为了参考以帮助其他人,我实施了 Varsha 提出的第一个建议,它确实产生了我需要的填充 ArrayList。非常感谢 Varsha。
  • 没问题。很高兴它帮助了你:-)
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多