2015-08-21 2 views
-2

У меня есть два класса один для звонка api. а другой - для получения значения для класса api. Возвращаемое значение имеет значение null от функции. как я получаю значение от результата возвращаемого значения. здесь есть функция класса: -получение null возвращаемое значение из функции

Jsondeletenote js = new Jsondeletenote(context); 
     String retn = js.deletsubmitData(); 

     Log.d("calllllllllll render", "helo"+retn); 
     // retn value coming null 

здесь апи класс

public String deletsubmitData() { 

     try { 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         Looper.prepare(); 
         Log.d("looper", "-->>>>"); 
         try { 
          isAuthorized = isAuthenticated(); 
         } catch (Exception e) { 
          Log.e("Exception ==> ", e.toString()); 
         } 
         MHandler.post(new Runnable() { 
          @Override 
          public void run() { 
           try { 
            if(isAuthorized){ 
             if(AuthenticationResultJSONObject!=null){ 
              Day1 = AuthenticationResultJSONObject.getString("Day"); 
              String Tomorrow = AuthenticationResultJSONObject.getString("Tomorrow"); 
              String Week = AuthenticationResultJSONObject.getString("Week"); 

             } 
            } 
            else 
            { 
             ///Toast.makeText(context, "Loing unsuccessfull, please try again !", Toast.LENGTH_SHORT).show(); 
            } 
           } 
           catch (Exception e) 
           { 
            e.printStackTrace(); 
            Log.e("Exception 146==> ", e.toString()); 
           } 
           finally 
           { 
            //dialog.cancel(); 
           } 
          } 

         }); 
        } catch (Exception e) { 
         Log.e("Exception 153==> ", e.toString()); 
        } 
       } 
      }).start(); 
     } catch (Exception e) { 
      Log.e("Exception 159==> ", e.toString()); 
     } 
     return Day1; 
    } 

    public boolean isAuthenticated() 
    { 
     isAuthorized = false; 

     final String url="www.abcd.com"; 

     try { 


       AuthenticationResultJSONObject = new JSONObject(doFetchDataFromWebService_Simple_OnlyJSONResponse(url));  

       Log.v("Online", "User json array === "+AuthenticationResultJSONObject); 
    else 
      { 
       MHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         Toast.makeText(context, "Please check your internet connection and try again.", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      }*/ 
     } 
     catch(Exception e){ 
      e.getMessage(); 
     } 
     finally{ 
      if(AuthenticationResultJSONObject!=null){ 
       isAuthorized = true; 
      } 
      else 
      { 
       isAuthorized=false; 
      } 
     } 
     return isAuthorized; 
    } 

ответ

0

Ваш код повсюду. Я предлагаю вам переписать его.

Короче говоря, вы выполняете асинхронную работу в отложенном потоке, что означает, что возвращаемое значение «deletsubmitData» немедленно возвращается с нулевым значением, пока поток может быть (и, вероятно, еще) работает ,

Что нужно сделать, это изменить метод возврата void и добавить обратный вызов к параметрам методов. в конце операций потока вызывается обратный вызов.

EDIT:
Создание интерфейса с помощью метода в нем. затем передать новый экземпляр объекта из этого интерфейса в качестве параметра, который вызывает метод.

Нечто подобное:

Создание интерфейса:

public interface IExampleCallBack 
{ 
    void onFinish(String result); 
} 

Создание экземпляра и передать в качестве параметра:

IExampleCallBack callback = new IExampleCallBack(
{ 
    @Override 
    public void onFinish(String result) 
    { 
     //do whatever you want with result. 
    } 
}; 
js.deletsubmitData(callback); 

Invoke метода интерфейса в результате:

public void deletsubmitData(IExampleCallBack callback) 
{ 
    //your code inside the thread... 
    //finish thread operation like so 
    String resultExample = "finished"; 
    if (callback != null) 
    { 
     callback.onFinish(resultExample); 
    } 
} 

Обратите внимание, что если параметр обратного вызова имеет значение null, вы никогда не получите обратный вызов из потока из-за нулевой проверки. но это лучше, чем сбой приложения.

Удачи.

+0

Можете ли вы мне пояснить код? как применять методы обратного вызова? –

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