0

facebookrunnerを使用してfacebookapiteskを適用しています。データまたはエラーメッセージを含むJSONオブジェクトを取得したかどうかを確認したいので、「メッセージ」フィールドをチェックして、それがnullかどうかを確認しています。nullではなく、マッサージを受けている場合は、メッセージを表示してアプリケーションを終了します。

これは私の活動における私のコードです:

public class Loader extends Activity implements FacebookConnectionListener, ServerDataListener {
    private TextView loaderStatus;
    private Facebook facebook;
    private AsyncFacebookRunner facebookRunner;
    private FacebookConnection facebookConnection;   

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loader);
        facebook = new Facebook(facebookAppId);
        facebookRunner = new AsyncFacebookRunner(facebook);
        facebookConnection = new FacebookConnection(this, 1);
        facebookRunner.request("me",facebookConnection);
    }

    @Override
    public void onFacebookResponse(final String response , int step) {
        final JSONObject facebookResults = convertToJSON(response);
        final Context thisContext = (Context) getBaseContext();
        String id = "", name = "", gender = "", homeTown = "";
        Drawable profilePicture = null;

        if (step == 1) {
            if (facebookResults.isNull("message")) {
                try {
                    id = facebookResults.getString("id");
                    name = facebookResults.getString("name");
                    gender = facebookResults.getString("gender");
                    JSONObject homeTownObject = (JSONObject) facebookResults.get("hometown");
                    homeTown = homeTownObject.getString("name");
                    profilePicture = getProfilePicture(id);

                } catch (JSONException e) { 
                    alert("Facebook", e.toString(), "Ok", thisContext);
                }
                facebookCurrentUser = new FacebookCurrentUser(id, name, gender);
                facebookCurrentUser.setHomeTown(homeTown);
                facebookCurrentUser.setProfilePicture(profilePicture);
                app.setFacebookCurrentUser(facebookCurrentUser);
                facebookConnection = new FacebookConnection(this, 2);   
                this.runOnUiThread(new Runnable() {
                public void run() {
                        loaderStatus.setText("Getting friends details");
                    }
                });
            }
            else {
                this.runOnUiThread(new Runnable() {
                    public void run() {
                        alert("Facebook", "Can't get user details! Please try again", "Ok", thisContext);
                    }
                }); 
            }           
        }

public void alert (String title, String message, String ok, Context listener)
{
    AlertDialog.Builder alert = new AlertDialog.Builder(listener);
    alert.setMessage(message);
    alert.setTitle(title);
    alert.setPositiveButton(ok, new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();   
        }
    });
    alert.show();
}

これはFacebookConnectionクラスです:

public class FacebookConnection implements RequestListener {
    private FacebookConnectionListener listener;
    private int step;

    public FacebookConnection (FacebookConnectionListener listener, int step) {
        this.listener = listener;
        this.step = step;
    }

    public void updateFacebookListener(String response) {
        listener.onFacebookResponse(response, step);
    }

    @Override
    public void onComplete(String response, Object state) {
        updateFacebookListener(response);           
    }

    @Override
    public void onIOException(IOException e, Object state) { }

    @Override
    public void onFileNotFoundException(FileNotFoundException e, Object state) { }

    @Override
    public void onMalformedURLException(MalformedURLException e, Object state) { }

    @Override
    public void onFacebookError(FacebookError e, Object state) { }
 }

FacebookConnectionListenerインターフェース:

public interface FacebookConnectionListener {
    public void onFacebookResponse(String response, int step);
}

私のアラートは私に:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

そして私は理由を理解することができません..助けますか?

4

3 に答える 3

0

表示される理由は、別のスレッドからUiを更新しようとしているためです。これは部分的なコードなので、コードを次のように変更することをお勧めします

MyActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                    loaderStatus.setText("Getting friends details");
                }
            });

ここで、MyActivityはアクティビティの名前です。

于 2012-04-07T15:32:15.623 に答える
0

簡単な方法:

uはpublishProgress(何か)を公開できます

アラートを表示するために、公開を処理します:D

于 2012-04-07T15:39:32.273 に答える
0

さて、これを試してください:

public void alert (String title, String message, String ok) {
    this.runOnUiThread(new Runnable() {
        public void run() {
            AlertDialog alert = new AlertDialog.Builder(Loader.this).create();
            alert.setMessage(message);
            alert.setTitle(title);
            alert.setPositiveButton(ok, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alert.show();
        }
    });
}

あなたが今持っているものの代わりに、そしてあなたがそれを呼ぶとき、他の方法のようにそれを呼ぶだけです:

this.alert("Facebook", "Can't get user details! Please try again", "Ok")

どこがうまくいかないのか正確にはわかりません。ダイアログを作成するときにcreate()の部分を忘れてしまったことに関係しているかもしれません。

これがあなたのために物事を分類することを願っています。

于 2012-04-07T18:13:42.703 に答える