【问题标题】:Could not display data from json in listview java and android.os.asynctask is deprecated无法在 listview java 中显示来自 json 的数据,并且不推荐使用 android.os.asynctask
【发布时间】:2021-02-03 07:13:29
【问题描述】:

当我想用 java 显示来自 android 的 json 数据时遇到问题 它在这里什么都没有显示

但是从 json 生成器它很好 这里是json的例子http://www.json-generator.com/api/json/get/cfYdxbAzma?indent=2

这是我的 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 已被弃用 这里发生了什么?我的代码有问题吗? 谢谢

【问题讨论】:

  • 请调试您的代码流是否进入 doInBackground 的 catch 块?
  • 除了“覆盖 android.os.asyncTask 中已弃用的方法”之外什么都没有显示

标签: java android json


【解决方案1】:

是的,现在不推荐使用异步任务。已经有更好和最好的替代方案,它们已经自动处理了这些黑客攻击,并提供了更具可读性和可维护性的代码。您必须尝试以下我提到的其中一种:

  1. 改造
  2. 凌空抽射
  3. 循环J

而且可以很容易地通过 stack-overflow 找到许多示例。

【讨论】:

  • 很高兴这对您有所帮助
【解决方案2】:

首先,我们需要您的异常的完整堆栈跟踪来检查代码有什么问题。起初,我没有看到您曾经执行过 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();
    }
}

要获取您需要的数据,只需像其他任何方法一样调用该函数

process();

就我而言,我使用 JsonNode 并使用我的 CustomHttpClient,它本身就是一个类。但是你可以做任何你想做的事情,只需相应地编辑它。还有很多其他的使用其他库的实现,但我发现这很容易阅读、快速且易于理解。

【讨论】:

  • 嗯 RxJava 是什么?它像框架吗?
  • 用谷歌作者的话来说,他们可能会比我描述得更好,RxJava 是 ReactiveX 的 Java VM 实现,该库用于异步和基于事件的程序,使用可观察序列。我将向您粘贴链接以检查如何使用它:factoryhr.medium.com/…。 ....您也可以使用它进行改造:stackoverflow.com/a/42218515/14759470
  • 很高兴能帮上忙,编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多