private void initData() { //1.创建一个请求队列 RequestQueue requestQueue=Volley.newRequestQueue(MainActivity.this); //2.创建一个请求 String URL=BASE_URL; JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(URL, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { initFoods(response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Log.d(TAG,"请求失败"+error); } }); //3.将创建好的请求添加到请求队列中 requestQueue.add(jsonObjectRequest); foodListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { view =View.inflate(MainActivity.this,R.layout.food_dialog,null); Food item = foods.get(i); food_edit_cancel =view.findViewById(R.id.food_edit_cancel); food_edit_cal = view.findViewById(R.id.food_edit_cal); food_edit_des =view.findViewById(R.id.food_edit_des); food_edit_doWay= view.findViewById(R.id.food_edit_doWay); food_edit_name =view.findViewById(R.id.food_edit_name); food_edit_type =view.findViewById(R.id.food_edit_type); food_edit_cal.setText(String.valueOf(item.getCal())); food_edit_des.setText(item.getDes()); food_edit_doWay.setText(item.getDoway()); food_edit_name.setText(item.getFoodname()); food_edit_type.setText(item.getFoodtype()); AlertDialog.Builder builder = new FoodDialog.Builder(MainActivity.this); final AlertDialog alertDialog = builder.create(); alertDialog.setView(view); food_edit_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alertDialog.cancel(); } }); alertDialog.show(); } }); }
时间: 2024-02-14 08:20:26 浏览: 142
这是一个在Android应用中使用Volley库进行网络请求的方法,并且在请求成功后解析JSON数据并进行相应的处理其中,先创建一个请求队列,然后创建一个请求,并将请求添加到队列中。在请求成功后,将得到的JSON数据传递给initFoods()方法进行处理。还设置了一个ListView的点击事件,点击后会弹出一个对话框显示相应的食品信息,并且可以进行修改。最后,使用AlertDialog.Builder创建一个对话框并显示出来。
相关问题
// 在安卓fragment中写了获取路线规划,代码如下: // BaiduNaviManagerFactory.getRoutePlanManager().routePlan(list, currentPrefer, bundle, handler); // private final Handler handler = new Handler(Looper.getMainLooper()) { // @Override // public void handleMessage(@NonNull Message msg) { // super.handleMessage(msg); // switch (msg.what) { // case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_START: // mFlRetry.setVisibility(View.GONE); // mLayoutTab0.setSelected(false); // mLayoutTab1.setSelected(false); // mLayoutTab2.setSelected(false); // break; // case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_SUCCESS: // mFlRetry.setVisibility(View.GONE); // mRlButton.setVisibility(View.VISIBLE); // updateBtnText(currentPrefer); // new Thread(() -> initData()).start(); // break; // case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_FAILED: // mFlRetry.setVisibility(View.VISIBLE); // break; // default: // break; // } // } // }; // 以上代码中 路线规划成功 后执行了 initData()方法, 方法中获取了3Tab信息和路线详情 这是个耗时操作,如下代码: // BNRoutePlanInfos routePlaneInfos = BaiduNaviManagerFactory.getRoutePlanManager() .getRoutePlanInfo(); // 所以在handler中使用了Thread来开启一个子线程去执行,那么获取3Tab信息和路线详情的getRoutePlanInfo()可能为空吗? // 如果报空指针异常,应该怎么处理?请帮我修改一下以上问题
在handler中使用Thread来开启一个子线程去执行initData()方法是正确的做法,这样可以避免在主线程中执行耗时操作导致UI卡顿的问题。但是需要注意的是,在子线程中调用getRoutePlanInfo()方法可能会返回null,因为该方法的执行时间可能比较长,而子线程的执行速度可能比主线程快,所以有可能在getRoutePlanInfo()方法执行完成之前子线程已经继续执行了下一步操作。如果getRoutePlanInfo()返回null,那么在使用该对象时就会抛出NullPointerException异常。
为了避免这种情况,可以在getRoutePlanInfo()方法返回null时进行延时重试,直到获取到非null的结果为止。具体代码如下:
```
private void initData() {
BNRoutePlanInfos routePlanInfos = null;
while (routePlanInfos == null) {
routePlanInfos = BaiduNaviManagerFactory.getRoutePlanManager().getRoutePlanInfo();
if (routePlanInfos == null) {
try {
Thread.sleep(100); // 延时100毫秒后重试
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 执行其他操作
}
```
这样就可以避免在使用routePlanInfos对象时出现NullPointerException异常了。
using System.Collections; using System.Collections.Generic; using UnityEngine; using ZenFulcrum.EmbeddedBrowser; namespace Mannager { public class test : MonoBehaviour { Browser browser; public UiMannager uiMannager; void Start() { this.InitData(); //uiMannager = UiMannager.GetInstance(); } private void Awake() { //获取插件Browser组件(Unity方使用插件基础一步) browser = gameObject.GetComponent<Browser>(); } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.H)) { browser.CallFunction("checkUi", "lampPanel").Done(); //uiMannager.CallFunction("lampPanel"); } } public void InitData() { browser.RegisterFunction("testAgain", (JSONNode jk) => { Debug.Log(jk[0].Value); }); } } } 添加多个方法监听
要添加多个方法监听,可以在 RegisterFunction 方法中传递一个委托数组,将多个方法都注册到同一个事件上。具体代码如下:
```csharp
public void InitData() {
browser.RegisterFunction("testAgain", new JSONNodeDelegate[] { OnTestAgain1, OnTestAgain2 });
}
private void OnTestAgain1(JSONNode jk) {
Debug.Log("OnTestAgain1: " + jk[0].Value);
}
private void OnTestAgain2(JSONNode jk) {
Debug.Log("OnTestAgain2: " + jk[0].Value);
}
```
在这个例子中,我们将 OnTestAgain1 和 OnTestAgain2 两个方法都注册到了名为 "testAgain" 的事件上。当事件被触发时,这两个方法都会被执行。
注意,由于 RegisterFunction 方法的第二个参数是委托数组,因此需要使用花括号来创建一个委托数组,并将多个委托作为数组元素传递进去。同时,这些委托方法的参数类型必须与 JSONNodeDelegate 委托类型的参数类型相同,否则编译会报错。
阅读全文