我正在尝试在我的Android应用中加载一些JSON。在MainActivity上,我创建了一个AsyncTask来下载JSON并解析它。这里的一切都有效,但我有一个问题就是将所有内容都放在ListView中。
我创建了一个模型(带有6个字符串)和适配器。 问题是,我无法使用“doInBackground”函数中的新内容更新List,而且我不知道如何将所有内容放在列表中。
答案 0 :(得分:0)
doInBackground()
方法无法访问UI线程,因此您无法执行此操作。在您的情况下,您应该使用ListView
方法更新onPostExecute
,或者直接在runOnUiThread()
方法中使用此doInBackground()
方法。
答案 1 :(得分:0)
如果您的适配器已正确设置以侦听List作为其数据源,那么您只需更改List中的元素,然后通过调用其中一种notify方法通知适配器,例如{{1 }}
但是,由于这是修改UI元素,因此需要在UI线程上运行。 AsyncTask的adapter.notifyDataSetChanged()
方法在与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();
}
}
}
}