Asyntask没有执行onPostExecute()

时间:2015-06-29 09:22:51

标签: android facebook

这是我的Asyntask代码,它没有触发onPostExecute()任何人都知道为什么会发生这种情况???

编辑:Asyntask以这种方式调用

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

        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();

        setContentView(R.layout.activity_main);
        .
        .
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(), SignUp.class);
                startActivity(intent);
            }
        });
        textView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(getApplicationContext(), Feedback.class);
                startActivity(intent);
            }
        });


        fbLoginButton = (LoginButton) findViewById(R.id.login_button);
        fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                token=loginResult.getAccessToken().getToken().toString();

                Log.v("tag", "Token:\n" + token);
                try {
                    get_profile();
                }catch (Exception ex) {
                    String error = ex.getMessage();
                }


            }

            @Override
            public void onCancel() {
                Toast.makeText(MainActivity.this, "Login cancelled by user!", Toast.LENGTH_LONG).show();
                System.out.println("Facebook Login failed!!");

            }

            @Override
            public void onError(FacebookException e) {
                Toast.makeText(MainActivity.this, "Login unsuccessful!", Toast.LENGTH_LONG).show();
                System.out.println("Facebook Login failed!!");
            }
        });
    }

get_profile();方法定义如下

//Method to get profile details
    public void get_profile() throws UnsupportedEncodingException {
        try {
            // Calling async task to get json
            new FetchOperation().execute();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这也在Main类中

//Asynctask to get Getting fb profile details
    private class FetchOperation extends AsyncTask<Void, Void, String> {
        String fb_token;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Get user defined values
            fb_token = token;


        }

        @Override
        protected String doInBackground(Void... params) {
            String response = "";
            String Urls = "https://graph.facebook.com/me?access_token=";
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(Urls +token);
            HttpEntity httpEntity = null;
            HttpResponse httpResponse = null;
            try {
                httpResponse = httpclient.execute(httpget);

            } catch (ClientProtocolException e) {
                e.printStackTrace();
                Log.v("Response", "Hi From e1 : " + e.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                httpEntity = httpResponse.getEntity();
                response = EntityUtils.toString(httpEntity);
                Log.v("Response", "Hi From 2 : "+response.toString());
                return response;
            } catch (IOException e) {
                e.printStackTrace();
                Log.v("Response", "Hi From e2 : " + e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String jsonStr) {
            super.onPostExecute(jsonStr);
            Log.v("tag", "Result:" + jsonStr);
            if (jsonStr != null) {
                try{
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    String email = jsonObj.getString("email");
                    String firstName = jsonObj.getString("first_name");
                    String lastName = jsonObj.getString("last_name");
                    String gender = jsonObj.getString("gender");
                    String country = jsonObj.getString("locale");
                    id = jsonObj.getString("id");
                    user = firstName.concat(" ");
                    user = user.concat(lastName);
                    image = "http://graph.facebook.com/" + id + "/picture?type=large";
                    Log.v("Fb name", "Bla bla Name : " + user);
                    new UploadOperation().execute();

                }
                catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }
        }
    }

这是logcat的最后一行

06-29 14:30:49.927    2091-2091/com.example.kmi_dev.fbloginsample V/tag﹕ Token:
    CA****************************************************************xr
06-29 14:30:50.697    2091-2135/com.example.kmi_dev.fbloginsample V/Response﹕ Hi From 2 : {"id":"910***********6","first_name":"Shivanshu","gender":"male","last_name":"Verma","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/910***********6\/","locale":"en_GB","name":"Shivanshu Verma","timezone":5.5,"updated_time":"2015-06-22T04:17:39+0000","verified":true}
06-29 14:31:23.827    2091-2098/com.example.kmi_dev.fbloginsample W/art﹕ Suspending all threads took: 10ms

我打算触发另一个asyntask,然后将这个asyntask提取的数据保存到数据库中。

2 个答案:

答案 0 :(得分:1)

进行这些更改,它将起作用 -

  1. private class FetchOperation extends AsyncTask<Void, Void, String> 更改为 - private class FetchOperation extends AsyncTask<Void, String, String>,因为,您正在尝试返回String。
  2. response = EntityUtils.toString(httpEntity); 改为 - response = EntityUtils.toString(httpEntity).toString(); 在下一行,你实际上已经完成了它。
  3. 在doInBackground方法的最后,return null; 更改为 - return response;
  4. 4.无需在onPostExecute()

    中调用super

    5.Inside onPostExecute()检查jsonStr是否为null,如果为null且包含json数据,则执行您想要执行的操作。

答案 1 :(得分:-1)

您的JSONObject不包含JSONString“email”,因此它正在线上

 String email = jsonObj.getString("email");

直接赶上阻挡。

相关问题