【问题标题】:Getting json response from server从服务器获取json响应
【发布时间】:2015-10-20 05:21:31
【问题描述】:

请有人帮助我, 我有一个 php 脚本,如果满足条件,它会以 "success" 的形式返回 Json 响应。 我已经放了一个日志语句,并且我得到了“成功”的响应,但是当我在 if 语句 中放入响应时,它无法识别它。 另外,如果我得到响应“成功”,我想在 if 语句 中将按钮颜色从红色更改为绿色,这给了我错误并且我的应用程序崩溃了。 所以我的问题是:

  1. 我得到响应“成功”但如何将其放入 if 语句中?因为它直接执行else语句。
  2. 如果我将按钮更改语句放在 else 部分进行测试,按钮更改语句会使我的应用程序崩溃。

这是我的代码

 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:::﹕“成功”
10-20 10:34:56.787 2433-2452/? W/dalvikvm﹕threadid=14: 线程以未捕获的异常退出 (group=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) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:124) 在 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) 在 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.movi​​elist.MovieDetailActivity$1SendPostReqAsyncTaskk.doInBackground(MovieDetailActivity.java:145) 在 com.sne.movi​​elist.MovieDetailActivity$1SendPostReqAsyncTaskk.doInBackground(MovieDetailActivity.java:114) 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 在 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) 在 java.lang.Thread.run(Thread.java:1096)
10-20 10:34:56.797 175-175/? W/ActivityManager:强制完成活动 com.sne.movi​​elist/.MovieDetailActivity
10-20 10:34:56.887 175-192/? I/ActivityManager: ensureBootCompleted():enableScreenfalse
10-20 10:34:56.897 2433-2433/? I/ActivityThread﹕queueIdle
10-20 10:34:56.897 2433-2433/? V/ActivityThread:报告ActivityRecord空闲{4a4c4b50 token=android.os.BinderProxy@4a4c4618 {com.sne.movi​​elist/com.sne.movi​​elist.MainActivity}} finished=false

【问题讨论】:

  • 这样写json.equals("success")
  • 请发布您的 json 回复
  • 我的回复只有一个字段为“成功”
  • 我这样写了 json.equals("success"),仍然无法在 @satyen udeshi 中工作

标签: java android json android-asynctask


【解决方案1】:

你应该使用equals()方法来比较Strings

点赞json.equals("\"success\"")

关于崩溃,您尝试从doInBackground() 方法更新UI,使其崩溃,更新您应该在onPostExecute() 方法中执行的UI,因为它保证在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 {

        } 

    }
}

【讨论】:

  • 感谢 alott @Satyen Udesh.. 两个问题都解决了..祝福你。
  • 只是给其他人的一个注释:在 onPostExecute 中编辑的代码中将我的 Satyen 替换为 json 的结果。
【解决方案2】:

至于json问题,首先在java中不要使用==比较字符串,总是使用equals

if (json.equals("success"))

另外,请确保您在比较正确的响应。可能不是简单的"success" 字符串,而是"{success}" json 对象字符串(可能以键值方式)。打印出对日志的响应并查看响应的确切格式。

至于例外,它说明了一切:

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

您只能在 UI 线程上更新 UI 组件,因为这是创建它的线程。

如果您在Activity 内运行,您可以使用runOnUiThread,或者为了安全起见,只需使用Looper

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

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

【讨论】:

    【解决方案3】:

    正如其他人建议的那样,您不应该使用 == 运算符来比较 两个字符串。 您应该使用:

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

    对于崩溃,您必须将以下代码 sn-p 移至您的 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);
    
                }
       }
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2018-01-25
      • 2012-07-09
      • 1970-01-01
      • 2018-05-26
      相关资源
      最近更新 更多