簡體   English   中英

無法在列表視圖中顯示來自 json 的數據 java 和 android.os.asynctask 已棄用

[英]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已棄用這是怎么回事? 我的代碼有問題嗎? 謝謝

是的,現在不推薦使用異步任務。 已經有更好和最好的替代方案,它們已經自動處理了這些黑客攻擊,並提供了更具可讀性和可維護性的代碼。 您必須嘗試其中一種,如下所述:

  1. Retrofit
  2. 排球
  3. 循環J

在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM