2015-07-18 2 views
1

Я использовал AsyncTask для проверки доступности сервера.Android, проверьте подключение к серверу, нажав на кнопку

class RetrieveFeedTask extends AsyncTask<String, String, Map<String, String>> { 

    private Exception exception; 
    ArrayList<String> str = new ArrayList<String>(); 
    Map<String, String> statusMap = new HashMap<>(); 

    private String job; 
    public ReturnData returnData; 
    public HomeFragment homeFragment = new HomeFragment(); 
    public AsyncResponse delegate; 
    Socket socket = null; 

    public void params(String job){ 
     this.job = job; 
    } 

    public void setAsyncResponse(AsyncResponse deletate){ 
     this.delegate = deletate; 
    } 


    @Override 
    protected Map<String, String> doInBackground(String... params){ 

     //ports: 8080 5060,5070,5080 
     if(job.equals("checkConn")) { 

      statusMap.clear(); 

      boolean reachable = true; 
      boolean wwwServ = true; 
      try { 
       InetAddress address = InetAddress.getByName(params[0]); 
       reachable = address.isReachable(10000); 
       Log.d("lab", "IP: "+ reachable); 
      } catch (Exception e){ 
      } 
      try { 
       (new Socket(params[0], 8080)).close(); 
      } 
      catch (UnknownHostException e) 
      { 
       wwwServ = false; 
      } 
      catch (IOException e) 
      { 
       wwwServ = false; 
      } 
      Log.d("lab", "WWW: " + wwwServ); 
      Log.d("lab", "Rozmiar listy: " + Integer.toString(str.size())); 
      //add values to map 
      statusMap.put("IP", Boolean.toString(reachable)); 
      statusMap.put("WWW", Boolean.toString(wwwServ)); 
     } 
     return statusMap; 
    } 
    @Override 
    protected void onPostExecute(Map<String, String> result) { 
     // Result is here now, may be 6 different List type. 
     Log.d("lab", "The returned list contains " +result.size()+ "elements"); 
     delegate.processFinish(result); 
    } 

} 

AsyncTask возвращает карту. Все было нормально, пока я не запустил его как функцию onCreateView. Проблема возникла при переходе в функцию onClick. Я сделал это, потому что обновление статуса только если пользователь нажал на карту, а не на кнопку.

public class HomeFragment extends Fragment implements AsyncResponse{ 

    Button checkConn; 
    TextView statusIP,statusWWW; 
    SharedPreferences savedSettings; 
    SharedPreferences.Editor editor; 
    private ArrayList<String> lista = new ArrayList<String>(); 
    private Map<String, String> statusMap = new HashMap<>(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 


     final RetrieveFeedTask task = new RetrieveFeedTask(); 
     task.setAsyncResponse(this); 
     task.params("checkConn"); 

     savedSettings = getActivity().getSharedPreferences("lab.linuxservice.com.linuxservice", Context.MODE_PRIVATE); //load shared preferences 
     editor = savedSettings.edit(); 

     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

     statusIP = (TextView)rootView.findViewById(R.id.ipStatusText); 
     statusWWW = (TextView)rootView.findViewById(R.id.sipServerStatusText); 

     checkConn = (Button) rootView.findViewById(R.id.checkConn); 
     checkConn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.d("lab", "Rozmiar listy w onCreateView: " + Integer.toString(statusMap.size())); 

       String data[] = {savedSettings.getString("IP", "")}; 
       task.execute(data); //chceck connection on click 

       String ipStatus = statusMap.get("IP"); 
       String wwwStatus = statusMap.get("WWW"); 

       Log.d("lab", "ipStatus: " + ipStatus); 

       if(ipStatus.equals("false")){ 
        statusIP.setText("Unavailable"); 
       } 
       else{ 
        statusIP.setText("Available"); 
       } 

       if(wwwStatus.equals("false")){ 
        statusWWW.setText("Unavailable"); 
       } 
       else{ 
        statusWWW.setText("Available"); 
       } 

       Toast.makeText(getActivity(), "Checking: ", Toast.LENGTH_SHORT).show(); 


      } 
     }); 

     return rootView; 
    } 

    public void processFinish(Map<String, String> output) { 
     this.statusMap = output; 
    } 
} 

Как начать AsyncTask в onClick- получаю эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
      at lab.linuxservice.com.linuxservice.HomeFragment$1.onClick(HomeFragment.java:132) 

линия указывает на:

if(ipStatus.equals("false")) 

Когда я ждать 9 сек Thread.sleep(9000); Log.d("lab", "ipStatus wolam: " + ipStatus);ipStatus в нуль, когда я нажмите кнопку второй раз ipStatus не является нулевым, это правда.

UPDATE

Я делаю так:

public TextView statusIP,statusWWW; 

@Override 
    protected void onPostExecute(Map<String, String> result) { 
     // Result is here now, may be 6 different List type. 
     Log.d("lab", "The returned list contains " + result.size() + "elements"); 
     delegate.processFinish(result); 
     homeFragment.updateView(view,result); 

     String ipStatus = statusMap.get("IP"); 
     String wwwStatus = statusMap.get("WWW"); 

     Log.d("lab", "ipStatus wolam: " + ipStatus); 

     statusIP = (TextView)view.findViewById(R.id.ipStatusText); 


     if(ipStatus.equals("false")){ 
      statusIP.setText("Unavailable"); 
     } 
     else{ 
      statusIP.setText("Available"); 
     } 
     if(wwwStatus.equals("false")){ 
      statusWWW.setText("Unavailable"); 
     } 
     else{ 
      statusWWW.setText("Available"); 
     } 
     Log.d("lab","wykonuje onPostExecute"); 


    } 

В RetrieveFeedTask но получаю сообщение об ошибке:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
+0

Код после 'task.execute (data);' скорее всего будет выполнен до завершения задачи и вызовет делегат 'AsyncResponse'. Переместите этот код в 'onPostExecute' задачи или ваш' processFinish' 'AsyncResponse'. –

+0

Да, но как это сделать, чтобы не представлять никаких данных в функции 'onPostExecute'. Просто сделайте это в отдельной функции - 'onClick' – lukassz

+0

Когда я жду 9 секунд' Thread.sleep (9000); Log.d («lab», «ipStatus wolam:» + ipStatus), '' ipStatus' в нуле, когда я дважды нажимаю кнопку «ipStatus» не равно null, это правда. – lukassz

ответ

0

Вы получаете эту ошибку, потому что переменная ipStatus равна нулю. Задайте значение этой переменной после завершения работы AsyncTask и предоставите карту состояния. Это означает перемещение линии String ipStatus = statusMap.get("IP"); в метод onPostExecute() AsyncTask.

+0

Речь идет о функции записи в классе' HomeFragment', который будет отображаться в режиме обновления, и вызвать его в 'onPostExecute'? – lukassz

+0

Да. Вы даже можете предоставить интерфейс для своей AsyncTask, который может реализовать ваш фрагмент, чтобы получить уведомление о том, что метод onPostExecute уже достигнут, и теперь вы можете использовать переменную ipStatus, поскольку она больше не равна нулю. Вот пример: http://stackoverflow.com/a/9963705/3060087 – Price

Смежные вопросы