AsyncTask doInBackground 返回数组列表

Posted

技术标签:

【中文标题】AsyncTask doInBackground 返回数组列表【英文标题】:AsyncTask doInBackground returns arraylist 【发布时间】:2017-12-30 07:07:43 【问题描述】:

我正在尝试从 Web 服务获取 json 响应并将其放入数组列表中。然后我想将arraylist 放入recyclerview。我正在使用 asynctask 在后台执行此操作。 Web 服务的响应是一个 json 数组。

public class MainActivity extends AppCompatActivity 

    String nombreChef;
    Double ratingChef;

    private RecyclerView rvMain;
    private RVMainAdapter mRVMainAdapter;

    private ArrayList<Chef> data= new ArrayList<>();

    private class AsyncCallWS extends AsyncTask<Void, Void, Void>

        @Override
        protected void onPreExecute() 
        

        @Override
        protected Void doInBackground(Void... params) 

            SoapObject soapObject = new SoapObject(Conexion.NAMESPACE, Conexion.METHOD_NAME_CHEFS_CERCA);
            soapObject.addProperty("idUser", Integer.valueOf(5));
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(soapObject);
            HttpTransportSE httpTransportSE = new HttpTransportSE(Conexion.URL);

            try 
                httpTransportSE.call(Conexion.SOAP_ACTION_TPNAME, envelope);
                String resultado = envelope.getResponse().toString();
                JSONObject json = new JSONObject(resultado);
                 nombreChef=json.getString("nombre_chef");
                 ratingChef=json.getDouble("rating");

                 //IM NOT SURE HOW TO PUT THE ARRAY RESPONSE INTO ARRAYLIST????
                data.add(new Chef(12,nombreChef,"Riuos","21","Jr los belepos",12,"Delivery",ratingChef.toString(),"Activo"));
            
            catch (Exception e) 
                Log.e("Estacion", e.getMessage());
                //result = "0";
            

            return null;
        

        @Override
        protected void onPostExecute(Void result) 

        
    

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AsyncCallWS task = new AsyncCallWS();
        task.execute();

        rvMain = (RecyclerView) findViewById(R.id.rv_prueba);
        rvMain.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        mRVMainAdapter = new RVMainAdapter(data);
        rvMain.setAdapter(mRVMainAdapter);

    

这是来自网络服务的 gson 响应:

【问题讨论】:

google“异步任务是如何工作的” 我不明白你想告诉我什么 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 如果你回答了这个问题会更好,如果你不知道,什么都不要回答。不要浪费你的时间或无所事事? 【参考方案1】:

您需要使用一些库或自己使用 android 中的 JSON 类来解析 JOSN 响应。 你可以谷歌来获取这方面的例子。 一个自己做的例子:

//Convert response string to JOSN array
JSONArray json = new JSONArray(responseText);

那么您需要遍历该数组以从中获取/提取相应的数据。返回此解析数据以在 onPostExecute 中获取此解析数据,从 onPostExecute 您可以更新列表适配器或对 UI 进行任何更新。

您可以参考this

【讨论】:

字符串响应文本 = 信封.getResponse().toString();然后像你已经提到的那样进行解析并将数据添加到arraylist,并从doInBackground返回这个arraylist。【参考方案2】:
 private class AsyncCallWS extends AsyncTask<Void, Void, ArrayList<Chef>>

    @Override
    protected void onPreExecute() 
    

    @Override
    protected ArrayList<Chef> doInBackground(Void... params) 
        ArrayList<Chef> data= new ArrayList<>();
        SoapObject soapObject = new SoapObject(Conexion.NAMESPACE, Conexion.METHOD_NAME_CHEFS_CERCA);
        soapObject.addProperty("idUser", Integer.valueOf(5));
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(soapObject);
        HttpTransportSE httpTransportSE = new HttpTransportSE(Conexion.URL);

        try 
            httpTransportSE.call(Conexion.SOAP_ACTION_TPNAME, envelope);
            String resultado = envelope.getResponse().toString();
            JSONObject json = new JSONObject(resultado);
             nombreChef=json.getString("nombre_chef");
             ratingChef=json.getDouble("rating");

             //IM NOT SURE HOW TO PUT THE ARRAY RESPONSE INTO ARRAYLIST????
            data.add(new Chef(12,nombreChef,"Riuos","21","Jr los belepos",12,"Delivery",ratingChef.toString(),"Activo"));
        
        catch (Exception e) 
            Log.e("Estacion", e.getMessage());
            //result = "0";
        

        return data;
    

    @Override
    protected void onPostExecute(ArrayList<Chef> result) 
        super.onPostExecute(result)

     // your result.(ArrayList<Chef>)
    

再次检查您的 json 解析。

【讨论】:

以上是关于AsyncTask doInBackground 返回数组列表的主要内容,如果未能解决你的问题,请参考以下文章

无法让 doInBackground 在 AsyncTask 中工作

如何使 AsyncTask“doInBackground()”等待一个数组列表

如何在 doInBackground 的 AsyncTask 中显示 toast

AsyncTask doInBackground方法未调用

即使使用取消方法也无法取消 AsyncTask 中的 doInBackground 进程

AsyncTask.doInBackground 在 2.3 上没有被调用,在 4.0+ 上工作