Android翻新:等待回应

问题描述:

我在我的应用中实施翻新2以调用Web服务。我的代码如下:Android翻新:等待回应

SignUp.java

ConnectionDetector connectionDetector = new ConnectionDetector(SignUpActivity.this); 
if (connectionDetector.isConnectingToInternet()) { 
    ArrayList<HashMap<String, String>> arrayListCountryDetails = new ArrayList<>(); 
    GetCountryList getCountryList = new GetCountryList(); 
    arrayListCountryDetails = getCountryList.CallWebServiceForCountryDetails(this); 

    // The app should wait here till the above retrofit web service calling returns response 


    CountryDetailsAdapter countryDetailsAdapter = new CountryDetailsAdapter(SignUpActivity.this, arrayListCountryDetails); 
    spinnerCountryName.setAdapter(countryDetailsAdapter); 
} else { 
    String message = "No internet connection."; 
    AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
    alertDialog.setTitle(getResources().getString(R.string.app_name)); 
    alertDialog.setMessage(message); 
    alertDialog.setCancelable(false); 
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
    alertDialog.show(); 
} 

GetCountryList.java

public class GetCountryList { 
    ProgressDialog dialog; 
    APIService mAPIService; 
    ArrayList<HashMap<String, String>> arrayListCountryDetails; 

    public ArrayList<HashMap<String, String>> CallWebServiceForCountryDetails(final Context context) { 
     dialog = new ProgressDialog(context); 
     dialog.setMessage("Please wait..."); 
     dialog.setCancelable(false); 
     dialog.show(); 

     arrayListCountryDetails = new ArrayList<>(); 

     mAPIService = ApiUtils.getAPIService(); 
     mAPIService.getCountryDetails().enqueue(new Callback<CountryDetailsResponseModel>() { 
      @Override 
      public void onResponse(Call<CountryDetailsResponseModel> call, Response<CountryDetailsResponseModel> response) { 

       if (response.isSuccessful()) { 
        HashMap<String, String> cntDetails = new HashMap<>(); 
        cntDetails.put("airLineID", "0"); 
        cntDetails.put("airLineName", "Select Airline"); 
        arrayListCountryDetails.add(cntDetails); 

        // Get response 
        try { 
         if (response.body().getStatus() == 200 && response.body().getMessage().equalsIgnoreCase("success")) { 
          for (int count = 0; count < response.body().getCountry().size(); count++) { 
           cntDetails = new HashMap<>(); 
           String countryID = response.body().getCountry().get(count).getCountryId(); 
           String countryName = response.body().getCountry().get(count).getCountryName(); 

           cntDetails.put("countryID", countryID); 
           cntDetails.put("countryName", countryName); 
           arrayListCountryDetails.add(cntDetails); 
          } 

          // do UI work here 
          if (dialog.isShowing()) { 
           dialog.dismiss(); 
          } 
         } else { 
          // do UI work here 
          if (dialog.isShowing()) { 
           dialog.dismiss(); 
          } 
         } 
        } catch (Exception e) { 
         // do UI work here 
         if (dialog.isShowing()) { 
          dialog.dismiss(); 
         } 
        } 
       } 
      } 

      @Override 
      public void onFailure(Call<AirLineDetailsResponseModel> call, Throwable t) { 
       // do UI work here 
       if (dialog.isShowing()) { 
        dialog.dismiss(); 
       } 
      } 
     }); 

     return arrayListCountryDetails; 
    } 
} 

当我执行我收到空指针异常错误的代码:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference 
    at com.abc.xyz.SignUpActivity.initializeScreen(SignUpActivity.java:176) 
    at com.abc.xyz.SignUpActivity.onCreate(SignUpActivity.java:147) 
    at android.app.Activity.performCreate(Activity.java:6575) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3121) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3278)  
    at android.app.ActivityThread.access$1000(ActivityThread.java:211)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:145)  
    at android.app.ActivityThread.main(ActivityThread.java:6912)  
    at java.lang.reflect.Method.invoke(Native Method) 

我知道这是因为微调器初始化执行发生在改进响应之前。

请建议我如何等待改造响应。上面的代码需要做什么修改。由于这个问题,请我无法前进。 在此先感谢。

+0

短期和简单的使用后设置适配器AsyncTask并设置你的适配器后,你有国家列表** arrayListCountryDetails **检查您的列表大小> 0之前设置适配器 –

非常粗略地做下面的事情。我只在AsyncTask方法中放置了必要的代码部分。根据需要修改。

if (connectionDetector.isConnectingToInternet()) { 


     // The app should wait here till the above retrofit web service calling returns response 

    AsyncTask task = new AsyncTask<Void, Void, List<Map<String, String>>>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      List<Map<String, String>> arrayListCountryDetails = new ArrayList<>(); 
      GetCountryList getCountryList = new GetCountryList(); 
      arrayListCountryDetails = getCountryList.CallWebServiceForCountryDetails(this); 
      return arrayListCountryDetails; 
     } 

     @Override 
     protected void onPostExecute(List<Map<String, String>> arrayListCountryDetails) { 
      CountryDetailsAdapter countryDetailsAdapter = new CountryDetailsAdapter(SignUpActivity.this, arrayListCountryDetails); 
      spinnerCountryName.setAdapter(countryDetailsAdapter); 
     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 
    task.execute(); 

} 

同时删除您GetCountryList任何UI调用,因为这将在“后台”运行

+0

它是一个正确的方法来做到这一点? –

+1

AsyncTask是访问数据库,网址和其他“后台”进程以便阻止用户界面的正确方法。做一些研究来得出你自己的结论https://developer.android.com/reference/android/os/AsyncTask.html – pleft

+1

@pleft改造网络调用已经在后台,我不认为它使用AsyncTask的好方法。 –

通行证微调对象在加载数据和加载完整

public class GetCountryList { 
ProgressDialog dialog; 
APIService mAPIService; 


public void CallWebServiceForCountryDetails(final Context context,final Spinner spinnerCountryName) { 
    dialog = new ProgressDialog(context); 
    dialog.setMessage("Please wait..."); 
    dialog.setCancelable(false); 
    dialog.show(); 

    final ArrayList<HashMap<String, String>> arrayListCountryDetails = new ArrayList<>(); 

    mAPIService = ApiUtils.getAPIService(); 
    mAPIService.getCountryDetails().enqueue(new Callback<CountryDetailsResponseModel>() { 
     @Override 
     public void onResponse(Call<CountryDetailsResponseModel> call, Response<CountryDetailsResponseModel> response) { 

      if (response.isSuccessful()) { 
       HashMap<String, String> cntDetails = new HashMap<>(); 
       cntDetails.put("airLineID", "0"); 
       cntDetails.put("airLineName", "Select Airline"); 
       arrayListCountryDetails.add(cntDetails); 

       // Get response 
       try { 
        if (response.body().getStatus() == 200 && response.body().getMessage().equalsIgnoreCase("success")) { 
         for (int count = 0; count < response.body().getCountry().size(); count++) { 
          cntDetails = new HashMap<>(); 
          String countryID = response.body().getCountry().get(count).getCountryId(); 
          String countryName = response.body().getCountry().get(count).getCountryName(); 

          cntDetails.put("countryID", countryID); 
          cntDetails.put("countryName", countryName); 
          arrayListCountryDetails.add(cntDetails); 
         } 

         // do UI work here 
         if (dialog.isShowing()) { 
          dialog.dismiss(); 
         } 
        //set Adapter 

        CountryDetailsAdapter countryDetailsAdapter = new CountryDetailsAdapter(context, arrayListCountryDetails); 
        spinnerCountryName.setAdapter(countryDetailsAdapter); 
        } else { 
         // do UI work here 
         if (dialog.isShowing()) { 
          dialog.dismiss(); 
         } 
        } 
       } catch (Exception e) { 
        // do UI work here 
        if (dialog.isShowing()) { 
         dialog.dismiss(); 
        } 
       } 
      } 
     } 

     @Override 
     public void onFailure(Call<AirLineDetailsResponseModel> call, Throwable t) { 
      // do UI work here 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    }); 


}