Я пытаюсь получить JSON с моего собственного сервера PHP.
Серверная часть моей работы в порядке, на самом деле она возвращает мне JSON-файл, который я довольно легко импортирую в приложение для Android.
Тем не менее, посмотрите на мой код:
Мой метод onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loans_list);
setTitle("Catalogo Libri");
bookList = new ArrayList<>();
new LoadAllBooks().execute();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Мой класс AsyncTask
class LoadAllBooks extends AsyncTask<String, String, String> {
ArrayList<String> titoli = new ArrayList<String>();
ArrayList<String> autori = new ArrayList<String>();
ArrayList<Bitmap> immagini = new ArrayList<Bitmap>();
/**
* Before starting background thread Show Progress Dialog
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(LoansList.this);
pDialog.setMessage("Loading books. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* getting All products from url
*/
protected String doInBackground(String... args) {
// Building Parameters
postRequest("0");
//
for (Map m : bookList) {
titoli.add((String) m.get("Title"));
autori.add((String) m.get("Author"));
byte[] data = Base64.decode((String) m.get("Cover"), Base64.DEFAULT);
immagini.add(BitmapFactory.decodeByteArray(data, 0, data.length));
}
authors = autori.toArray(new String[autori.size()]);
names = titoli.toArray(new String[titoli.size()]);
images = immagini.toArray(new Bitmap[immagini.size()]);
return null;
}
/**
* After completing background task Dismiss the progress dialog
**/
protected void onPostExecute(String file_url) {
// dismiss the dialog after getting all products
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
* */
ListView l = (ListView) findViewById(R.id.books);
CustomAdapter ad = new CustomAdapter();
l.setAdapter(ad);
}
});
}
}
Мой Пользовательский Класс Адаптера
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return images.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup parent) {
view = getLayoutInflater().inflate(R.layout.custom_layout, null);
ImageView im = (ImageView) view.findViewById(R.id.cover);
TextView t1 = (TextView) view.findViewById(R.id.title);
TextView t2 = (TextView) view.findViewById(R.id.author);
im.setImageBitmap(images[i]);
t1.setText(names[i]);
t2.setText(authors[i]);
return view;
}
}**My PostRequest method :**
public void postRequest(final String user_id) {
final String[] a = new String[1];
RequestQueue queue = Volley.newRequestQueue(LoansList.this);
String url = getBooksPhp;
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
a[0] = response;
try {
JSONObject json = new JSONObject(a[0]);
books = json.getJSONArray("books");
try {
// looping through All Products
for (int i = 0; i < books.length(); i++) {
JSONObject c = books.getJSONObject(i);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put("Title", c.getString("Titolo"));
map.put("Author", c.getString("Autore"));
map.put("Cover", c.getString("Copertina"));
System.out.println("CIAO " + c.getString("Autore"));
// adding HashList to ArrayList
bookList.add(map);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
} catch (JSONException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("OH NO");
}
}) {
//adding parameters to the request
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("user_id", user_id);
return params;
}
};
// Add the request to the RequestQueue.
queue.add(stringRequest);
}
Мой метод PostRequest:
public void postRequest(String user_id) {
final String[] a = new String[1];
RequestQueue queue = Volley.newRequestQueue(LoansList.this);
String url = getBooksPhp;
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
a[0] = response;
try {
JSONObject json = new JSONObject(a[0]);
books = json.getJSONArray("books");
try {
// looping through All Products
for (int i = 0; i < books.length(); i++) {
JSONObject c = books.getJSONObject(i);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put("Title", c.getString("Titolo"));
map.put("Author", c.getString("Autore"));
map.put("Cover", c.getString("Copertina"));
// adding HashList to ArrayList
bookList.add(map);
}
} catch (JSONException e1) {
e1.printStackTrace();
}
} catch (JSONException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println("OH NO");
}
}) {
//adding parameters to the request
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("user_id", user_id);
return params;
}
};
// Add the request to the RequestQueue.
queue.add(stringRequest);
}
Теперь проблема в том, что ProgressDialog не отображается.
Сначала создается представление, а затем завершается мой запрос.
Теперь я знаю, что AsyncTask не блокирует, но я пытаюсь сделать что-то вроде:
когда я начинаю задание, появляется диалоги выполнения, пока асинхронная задача не заканчивает захват данных -> я получаю json -> я его анализирую -> я создаю свой массив содержимого (изображения обложек, заголовки и авторы) -> я передаю данные своему CustomAdapter, который делает ListView для меня.
Итак, как я могу сделать, чтобы «синхронизировать» потоки и контролировать поток моей программы, как я хотел бы?
Спасибо !
Задача ещё не решена.
Других решений пока нет …