2015-10-20 6 views
-3

Пожалуйста, кто-то поможет мне в этом, У меня есть php скрипт, который возвращает Json ответ как «успех», если условие выполнено. Я поставил заявление журнала, и я получаю ответ как «успех», но когда я помещаю reesponse в , если оператор не распознает его. плюс, если я получаю ответ «Успех», я хочу изменить цвет кнопки с красного на зеленый в , если оператор, который дает мне ошибку, и мое приложение падает. , так что моя проблема заключается в следующем:Получение ответа JSON от сервера

  1. Я получаю ответ «успех», но как включить его в утверждение if? потому что он непосредственно выполняет инструкцию else.
  2. Оператор смены кнопки приводит к сбою моего приложения, если я поставлю оператор смены кнопки в другой части для тестирования.

Вот мой код

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    // Session class instance 
    session = new SessionManager(getApplicationContext()); 
    Toast.makeText(getApplicationContext(), "User Login Status: " + session.isLoggedIn(), Toast.LENGTH_LONG).show(); 
    /** 
    * Call this function whenever you want to check user login 
    * This will redirect user to LoginActivity is he is not 
    * logged in 
    * */ 
    session.checkLogin(); 

    setContentView(R.layout.movie_detail); 
    bt=(Button)findViewById(R.id.buttonchange); 
    titlee=(TextView)findViewById(R.id.mtitle); 
    date=(TextView)findViewById(R.id.mdate); 
like=(TextView)findViewById(R.id.mlikes); 
    video=(TextView)findViewById(R.id.mvideo); 
    idd=(TextView)findViewById(R.id.mid); 
    image=(ImageView)findViewById(R.id.imageView); 
    UniqueId=(TextView)findViewById(R.id.unique_id); 
    ts=(TextSwitcher)findViewById(R.id.tsLikesCounter); 



    Intent i=getIntent(); 
    //image.setImageResource(i.getStringExtra("THUMB")); 
    titlee.setText(i.getStringExtra("TITLE")); 
    like.setText("Likes = "+i.getStringExtra("LIKES")); 
    date.setText("Date = " + i.getStringExtra("DATE")); 
    video.setText("Video = " + i.getStringExtra("VIDEO")); 
    idd.setText(i.getStringExtra("IDD")); 
    UniqueId.setText(i.getStringExtra("UNIQUEID")); 



    String id = idd.getText().toString(); 

    String unique = UniqueId.getText().toString(); 

    // private void insertToDatabase(String id,String unique){ 
    class SendPostReqAsyncTaskk extends AsyncTask<String, String, String> { 
     @Override 
     protected String doInBackground(String... params) { 
      String paramUsername = params[0]; 
      String paramAddress = params[1]; 

      String id = idd.getText().toString(); 
      String unique = UniqueId.getText().toString(); 


      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("id", id)); 
      nameValuePairs.add(new BasicNameValuePair("unique", unique)); 

      // getting JSON Object 
      // Note that create product url accepts POST method 

      try { 
       HttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost("MY_URL"); 
       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       HttpResponse response = httpClient.execute(httpPost); 
       String json = EntityUtils.toString(response.getEntity()); 

       if(json=="success"){ 
        Log.d("IN IF::", json); 
        bt.setBackgroundResource(R.drawable.green1); 
       } 
       else { 
        Log.d("IN ELSE:::", json); 

       } 
       // writing response to log 
       Log.d("Http Response:::", json); 
       // Toast.makeText(getBaseContext(), response.toString(), Toast.LENGTH_SHORT).show(); 
      HttpEntity entity = response.getEntity(); 

       //JSONObject myObject = new JSONObject(TAG_SUCCESS); 

       // int success =response.getInt(TAG_SUCCESS); 


      } catch (ClientProtocolException e) { 

      } catch (IOException e) { 

      } 
      return "success"; 


     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 


     } 
    } 

    SendPostReqAsyncTaskk check = new SendPostReqAsyncTaskk(); 
    check.execute(id, unique); 

} 

здесь ошибка в заявлении изменения кнопки

10-20 10: 34: 56,597 2433-2452 /? D/IN ELSE :::: "success"
10-20 10: 34: 56.787 2433-2452 /? W/dalvikvm: threadid = 14: выход с отключенным исключением (группа = 0x400207d8)
10-20 10: 34: 56,797 2433-2452 /? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask # 1 java.lang.RuntimeException: Произошла ошибка во время выполнения doInBackground() на android.os.AsyncTask $ 3.done (AsyncTask.java:200) на java.util.concurrent. FutureTask $ Sync.innerSetException (FutureTask.java:273) at java.util.concurrent.FutureTask.setException (FutureTask.java:124) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) на java.util.concurrent.FutureTask.run (FutureTask.java:137) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561) at java.lang.Thread.run (Thread.java:1096) Вызвано: android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. на android.view.ViewRoot.checkThread (ViewRoot.java:2812) в android.view.ViewRoot.invalidateChild (ViewRoot.java:607) в android.view.ViewRoot.invalidateChildInParent (ViewRoot.java:633) на android.view.ViewGroup.invalidateChild (ViewGroup.java:2505) на android.view.View.invalidate (View.java:5139) на android.view.View.setBackgroundDrawable (View.java:7486) на android. view.View.setBackgroundResource (View.java:7395) в com.sne.movielist.MovieDetailActivity $ 1SendPostReqAsyncTaskk.doInBackground (MovieDetailActivity.java:145) в com.sne.movielist.MovieDetailActivity $ 1SendPostReqAsyncTaskk.doInBackground (MovieDetailActivity.java: 114) на android.os.Asyn cTask $ 2.call (AsyncTask.java:185) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) at java.util.concurrent.FutureTask.run (FutureTask.java:137) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) по адресу java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 561) at java.lang.Thread.run (Thread.java:1096)
10-20 10: 34: 56.797 175-175 /? W/ActivityManager: принудительная финишная деятельность com.sne.movielist/.MovieDetailActivity
10-20 10: 34: 56.887 175-192 /? I/ActivityManager: обеспечитьBootCompleted(): enableScreenfalse
10-20 10: 34: 56,897 2433-2433 /? I/ActivityThread: queueIdle
10-20 10: 34: 56.897 2433-2433 /? В/ActivityThread: Отчетность простоя из ActivityRecord {4a4c4b50 [email protected] {com.sne.movielist/com.sne.movielist.MainActivity}} закончил = ложная

+0

записи, как это 'json.equals («success») ' –

+0

Пожалуйста, напишите свой ответ json – KishuDroid

+0

. Мой ответ - это только одно поле« успех ». – Shelby

ответ

2

Вы должны использовать equals() метод для сравнения Strings,

например json.equals("\"success\"")

И относительно аварии вы пытаетесь обновить UI от doInBackground() поэтому он сбой, чтобы обновить пользовательский интерфейс, который вы должны сделать в методе onPostExecute(), поскольку он гарантированно исполняется в потоке UI.

В вашем случае вы можете сделать что-то вроде ниже

В вашем методе doInBackground() вернуть json и сравнить результат в onPostExecute(),

// private void insertToDatabase(String id,String unique){ 
class SendPostReqAsyncTaskk extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     String paramUsername = params[0]; 
     String paramAddress = params[1]; 

     String id = idd.getText().toString(); 
     String unique = UniqueId.getText().toString(); 

     String json = ""; 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("id", id)); 
     nameValuePairs.add(new BasicNameValuePair("unique", unique)); 

     // getting JSON Object 
     // Note that create product url accepts POST method 

     try { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost("MY_URL"); 
      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

      HttpResponse response = httpClient.execute(httpPost); 
      json = EntityUtils.toString(response.getEntity()); 


     } catch (ClientProtocolException e) { 

     } catch (IOException e) { 

     } 
     return json; 


    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     if(result.equals("\"success\"")){ 
     // Update your Button here 
     } else { 

     } 

    } 
} 
+0

Спасибо аллоту @ Сатюну Удесу. Обе проблемы решены. – Shelby

+0

просто примечание для других: в onPostExecute в отредактированном коде отправлен мой Satyen, замените результат на json. – Shelby

+0

рад помочь :) –

2

Что касается вопроса JSon, прежде всего не сравнить строки в Java с помощью ==, всегда используйте equals:

if (json.equals("success")) 

Кроме того, убедитесь, что вы по сравнению с правильным ответом. Может быть, что вместо простой строки "success" вы получаете строку json object "{success}" (возможно, с ключом). Распечатайте ответ на журнал и посмотрите точный формат ответа.

Что касается исключения, он говорит, что это все:

Caused by: android.view.ViewRoot$CalledFromWrongThreadException: 
    Only the original thread that created a view hierarchy can touch its views. 

Вы можете только обновлять компоненты пользовательского интерфейса на потоке пользовательского интерфейса, так как это поток, который создал его.

Если вы работаете внутри Activity, вы можете использовать runOnUiThread, или быть на безопасной стороне просто использовать Looper:

new Handler(Looper.getMainLooper()).post(new Runnable() { 

    @Override 
    public void run() { 
     //your code here 
    } 
}); 
0

Как другой предложил вам не следует использовать == оператора для сравнения две строки. Вы должны использовать:

if (json.equals("success")) 
Or 
if (json.equalsIgnoreCase("success")) 

А для аварии вы должны переместить ниже фрагмент кода вам onPostExecute() метод, как, как показано ниже:

@Override 
    protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      if(json=="success"){ 
        Log.d("IN IF::", json); 
        bt.setBackgroundResource(R.drawable.green1); 
      } else { 
        Log.d("IN ELSE:::", json); 

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