使用AsyncTask在List中插入元素

时间:2017-02-21 14:06:05

标签: android json android-asynctask

我正在尝试在我的Android应用中加载一些JSON。在MainActivity上,我创建了一个AsyncTask来下载JSON并解析它。这里的一切都有效,但我有一个问题就是将所有内容都放在ListView中。

我创建了一个模型(带有6个字符串)和适配器。 问题是,我无法使用“doInBackground”函数中的新内容更新List,而且我不知道如何将所有内容放在列表中。

3 个答案:

答案 0 :(得分:0)

doInBackground()方法无法访问UI线程,因此您无法执行此操作。在您的情况下,您应该使用ListView方法更新onPostExecute,或者直接在runOnUiThread()方法中使用此doInBackground()方法。

答案 1 :(得分:0)

如果您的适配器已正确设置以侦听List作为其数据源,那么您只需更改List中的元素,然后通过调用其中一种notify方法通知适配器,例如{{1 }}

但是,由于这是修改UI元素,因此需要在UI线程上运行。 AsyncTask的adapter.notifyDataSetChanged()方法在与UI线程不同的线程上运行,因此我们需要做以下两件事之一:

  • 等到我们在单独的线程中完成,然后通知适配器
  • 告诉UI线程通知适配器

如果我们在AsyncTask的doInBackground()方法中调用adapter.notifyDataSetChanged(),则第一个很容易完成。

如果我们通过调用onPostExecuted方法引用Activity对象,则第二个很容易完成。

希望这有帮助。

答案 2 :(得分:0)

您无法在 doInBackground()方法中更新或放置listview中的数据。您必须将 Adpter 分配给 Listview onCreate() MainActivity 方法和 onPostExecute()< / strong>方法更新列表视图。我在下面发布的代码片段会很有帮助。

public class MainActivity extends AppCompatActivity {
String json_string;
JSONObject jsonObject;
JSONArray jsonArray;
ContactAdapter contactAdapter;
ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new BackegroundTask().execute();
    listView = (ListView)findViewById(R.id.listview);
    contactAdapter = new ContactAdapter(this,R.layout.row_layout);

    listView.setAdapter(contactAdapter);



}

class BackegroundTask extends AsyncTask<Void,Void,String>
{
    String json_url;
    String JSON_STRING;

    @Override
    protected void onPreExecute() {

        json_url = "http://10.0.2.2/webapp/index.php";
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {
            URL url = new URL(json_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setDoOutput(true);
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();

            while ((JSON_STRING = bufferedReader.readLine()) != null){
                stringBuilder.append(JSON_STRING+"\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return stringBuilder.toString().trim();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }


    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        json_string = result;

        try {
            jsonObject  = new JSONObject(json_string);
            jsonArray = jsonObject.getJSONArray("server_response");
            int count = 0;
            String id,username;
            while (count<jsonArray.length()){
                JSONObject job = jsonArray.getJSONObject(count);
                id = job.getString("id");
                username = job.getString("username");
                Contacts contacts = new Contacts(id,username);
                contactAdapter.add(contacts);
                contactAdapter.notifyDataSetChanged();
                count++;
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

}