![](/img/trans.png)
[英]at android.os.AsyncTask$3.done(AsyncTask.java:300)
[英]Could not display data from json in listview java and android.os.asynctask is deprecated
當我想用 json 從 android 和 java 顯示數據時遇到問題
但是從 json 生成器這里很好的是 json http://www.json-generator.com/api/json/get/cfYdxbAzma?indent的例子
這是我的 MainActivity.java
package com.example.callapi;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.AsyncTask;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private static String url = "http://www.json-generator.com/api/json/get/cfYdxbAzma?indent=2";
ArrayList<HashMap<String,String>> bookList;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
bookList = new ArrayList<>();
}
private class getBooks extends AsyncTask<Void, Void,Void> {
@Override
protected void onPostExecute(Void aVoid){
super.onPostExecute(aVoid);
if(progressDialog.isShowing())
{
progressDialog.dismiss();
}
ListAdapter listAdapter = new SimpleAdapter(MainActivity.this, bookList,R.layout.item,new String[]{"book_name"},new int[]{R.id.book_name});
listView.setAdapter(listAdapter);
}
@Override
protected void onPreExecute(){
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Loading.....");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... voids){
Handler handler = new Handler();
String jsonString = handler.httpServiceCall(url);
if(jsonString!=null){
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray books = jsonObject.getJSONArray("Book");
for(int i= 0; i<books.length(); i++){
JSONObject jsonObject1 = books.getJSONObject(i);
String id_book = jsonObject1.getString("id_book");
String book_name = jsonObject1.getString("book_name");
HashMap<String,String> bookMap = new HashMap<>();
bookMap.put("id_book",id_book);
bookMap.put("book_name",book_name);
bookList.add(bookMap);
}
} catch (JSONException e) {
Toast.makeText(getApplicationContext(),"Json Parsing Error",Toast.LENGTH_LONG).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Json Parsing Error",Toast.LENGTH_LONG).show();
}
});
}
}
else {
Toast.makeText(getApplicationContext(),"Server Error",Toast.LENGTH_LONG).show();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Json Parsing Error",Toast.LENGTH_LONG).show();
}
});
}
return null;
}
}
}
我看到了類似這樣的android.os.AsyncTask
已棄用這是怎么回事? 我的代碼有問題嗎? 謝謝
是的,現在不推薦使用異步任務。 已經有更好和最好的替代方案,它們已經自動處理了這些黑客攻擊,並提供了更具可讀性和可維護性的代碼。 您必須嘗試其中一種,如下所述:
在 stack-overflow 上可以很容易地找到許多示例。
首先,我們需要您的異常的完整堆棧跟蹤來檢查代碼有什么問題。 起初,我沒有看到您曾經執行過 AsyncTask。 即使 AsyncTask 已被棄用,它仍然有效,但它是現代問題的舊解決方案。
為了解決這個問題,我可能會建議使用 RxJava,下面是一個例子:
private void process() {
try {
Observable.fromCallable(new Callable<JsonNode>() {
@Override
public JsonNode call() {
try {
JSONObject jsonObject;
//prepare your JSONObject for HttpClient
JsonParser jsonParser = new CustomHttpClient().postParser(url, jsonObject.toString());
ObjectMapper mapper = new ObjectMapper();
return mapper.readTree(jsonParser);
} catch (Exception e) {
e.getMessage();
}
return JsonNodeFactory.instance.objectNode();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<JsonNode>() {
@Override
public void accept(@NonNull JsonNode node) throws Exception {
try {
if (node == null || node.isEmpty()) {
return;
}
if (node.get("status_code").asInt() != 200) {
return;
}
//do something with your data
} catch (Exception e) {
e.getMessage();
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
Exception e = new Exception(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
try {
} catch (Exception e) {
e.getMessage();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
要獲取您需要的數據,只需像其他任何人一樣調用 function
process();
就我而言,我使用 JsonNode 並使用我的 CustomHttpClient,它本身就是一個 class。 但是你可以做任何你想做的事情,只需相應地編輯它。 還有許多其他使用其他庫的實現,但我發現這易於閱讀、快速且易於理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.