2015-09-18 3 views
1

Я пытаюсь реализовать метод Asynctask с комбинацией GCMJSONObject в подклассе. У меня возникают проблемы с применением условия GCM в методе doinBackground.doInBackground метод должен возвращать результат типа JSONObject

Ниже титры из doInBackground method

protected JSONObject doInBackground(String... args) { 

    GCMRegistrar.checkDevice(context); 
    GCMRegistrar.checkManifest(context); 
    final String regId = GCMRegistrar.getRegistrationId(context); 
    if (regId.equals("")) {   
     GCMRegistrar.register(context,SENDER_ID); 
    }else { 
     if (GCMRegistrar.isRegisteredOnServer(context)) {    
      Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
     } else { 
       UserFunctions userFunction = new UserFunctions(); 
       JSONObject json =userFunction.registerUser(context,fname, lname, email, password,regId); 
       return json; 
     } 
    } 
} 

Мой IDE оленья кожа позволяют ему быть выполнена. Это сообщение об ошибке, которое оно дает.

Этот метод должен возвращать результат типа JSONObject

Теперь, когда возвращаемое значение берется из условий вышеуказанных код работают правильно, однако возвращаемое значение предположит, будет выполняться только тогда, когда условия верны.

UPDATE

Существует еще одна проблема с этим. json всегда возвращает null в методе doInBackground, потому что, когда регистрация GCM зарегистрирована, регистратор GCM регистрирует его. Как только он регистрируется, служба регистрации GCM берет на себя регистрацию сервера, это означает, что json в doInBackground отправит нулевое значение в onPostExecute method.

Я также проверяю на успех и проверку в методе onPostExecute. После проверки для validaton сообщение отправляется в пользовательский интерфейс.

Если json отправить пустое значение метода onPostExecute я не могу делать какие-либо проверки и размещения сообщения в интерфейсе

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

+0

метод должен возвращать значение в любых условиях. Вы должны хотя бы вернуть нулевое значение в конце метода. – shhp

+0

Вы должны положить 'return null' в последнюю строку или внутри if (...) – BNK

+0

Для вашего обновления: IMO, вы можете обратиться к [мой ответ здесь] (http://stackoverflow.com/questions/32299997/how-to-implement-a-gcm-hello-world-for-android-using- андроид-студия) – BNK

ответ

1

Это потому, что вы определили объект JSONObject. Попробуйте это -

protected JSONObject doInBackground(String... args) { 

    GCMRegistrar.checkDevice(context); 
    GCMRegistrar.checkManifest(context); 
    final String regId = GCMRegistrar.getRegistrationId(context); 
    JSONObject jsonObject = null; //Declaration 
    if (regId.equals("")) { 
     GCMRegistrar.register(context,SENDER_ID); 
    }else { 
     if (GCMRegistrar.isRegisteredOnServer(context)) { 
      Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
     } else { 
      UserFunctions userFunction = new UserFunctions(); 
      jsonObject =userFunction.registerUser(context,fname, lname, email, password,regId); 

     } 
    } 
    return jsonObject; 
} 

Теперь в вашем onPostExecute() просто проверить, что если ваш JSONObject является недействительным или не перед запуском доступа к данным -

@Override 
protected void onPostExecute(JSONObject jsonObject) { 
    if(jsonObject != null) { 
     //Do something i.e. access data 
    } else { 
     //Handle null JSON 
    } 
} 
+0

Спасибо за помощь, пожалуйста, проблема в этом, любезно проверьте мой вопрос, я обновил его. Спасибо – NewBIe

+0

Как я вижу, вы используете GCMRegister, который устарел. Вы должны использовать GoogleCloudMessaging в качестве объекта GCMRegister и должны быть помещены в AsyncTask. Попробуйте портировать GoogleCloudMessaging. Это облегчит вашу жизнь. – Varundroid

+0

Действительно, GoogleCloudMessaging сделал мою жизнь очень легкой, спасибо sooo much @Varundroid – NewBIe

0

Просто объявите переменную снаружи и верните ее.

protected JSONObject doInBackground(String... args) { 

    JSONObject json = null; 

    GCMRegistrar.checkDevice(context); 
    GCMRegistrar.checkManifest(context); 
    final String regId = GCMRegistrar.getRegistrationId(context); 

    if (regId.equals("")) {   
     GCMRegistrar.register(context,SENDER_ID); 
    } else { 
     if (GCMRegistrar.isRegisteredOnServer(context)) {    
      Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
     } else { 
      UserFunctions userFunction = new UserFunctions(); 
      json = userFunction.registerUser(context,fname, lname, email, password,regId); 
     } 
    } 

    return json; 
} 
0

Вы можете просто return null если нет ничего, чтобы пройти обратно.

protected JSONObject doInBackground(String... args) { 

    // declare it here 
    JSONObject json = null; 
    GCMRegistrar.checkDevice(context); 
    GCMRegistrar.checkManifest(context); 
    final String regId = GCMRegistrar.getRegistrationId(context); 
    if (regId.equals("")) {   
     GCMRegistrar.register(context,SENDER_ID); 
    }else { 
     if (GCMRegistrar.isRegisteredOnServer(context)) {    
      Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
     } else { 
      UserFunctions userFunction = new UserFunctions(); 
      json =userFunction.registerUser(context,fname, lname, email, password,regId); 
     } 
    } 

    // if the criteria isn't met then return the null object reference 
    return json; 
} 

тогда вобще ссылочный нулевой чек в onPostExecute().

Если вы говорите, что метод возвращает что-то определенного типа, вам нужно это сделать. Вам просто нужно всегда думать, если объект может быть null