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