【问题标题】:Pass callback method result with in a non-activity class to android activity class?将非活动类中的回调方法结果传递给android活动类?
【发布时间】:2015-04-16 07:21:24
【问题描述】:

我需要创建 twitter 结构可重用组件。我的第一步是通过简单地调用类中的方法来允许使用 twitter 登录。

代码

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

import com.twitter.sdk.android.Twitter;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterAuthToken;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterAuthClient;
import com.twitter.sdk.android.core.models.Tweet;
import com.twitter.sdk.android.core.services.StatusesService;

import io.fabric.sdk.android.Fabric;


public class TwitterAuth {

private String CONSUMER_KEY;
private String CONSUMER_SECRET;
private Context context;
private TwitterAuthClient client;
private StatusesService service;

public TwitterAuth(Context context, String CONSUMER_KEY, String CONSUMER_SECRET) {
    this.CONSUMER_KEY = CONSUMER_KEY;
    this.CONSUMER_SECRET = CONSUMER_SECRET;
    this.context = context;
    configureKey();
}

public void configureKey() {
    TwitterAuthConfig authConfig = new TwitterAuthConfig(CONSUMER_KEY, CONSUMER_SECRET);
    Fabric.with(context, new Twitter(authConfig));
}

public void doLogin() {
    client = new TwitterAuthClient();
    client.authorize((Activity) context, new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> twitterSessionResult) {
            final TwitterSession session = Twitter.getSessionManager().getActiveSession();
            TwitterAuthToken authToken = session.getAuthToken();
            String token = authToken.token;
            String secret = authToken.secret;
            String userName = session.getUserName();
            Toast.makeText(context, "TWITTER EASY LIB TEST :: Done Login With \n Username :" + userName + " \n Token :" + token + "\n Secret :" + secret, Toast.LENGTH_LONG).show();
            //Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void failure(TwitterException e) {
            Toast.makeText(context, "TWITTER EASY LIB TEST :: failure", Toast.LENGTH_SHORT).show();
        }
    });
}


public void doLogout() {
    Twitter.getSessionManager().clearActiveSession();
}

public void publishTweet(String tweet) {
    service = Twitter.getInstance().getApiClient().getStatusesService();
    service.update(tweet, null, null, null, null, null, null, null, new Callback<Tweet>() {
        @Override
        public void success(Result<Tweet> tweetResult) {
            Toast.makeText(context, "Tweet Updated !",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void failure(TwitterException e) {
            Toast.makeText(context, "Error occured !",
                    Toast.LENGTH_SHORT).show();
        }
    });
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    client.onActivityResult(requestCode, resultCode, data);
}

}

活动

package codelynks.twitter.twitterintegration;


import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;

import com.easytweet.TwitterAuth;

public class CheckLib extends ActionBarActivity {
private Button cus;
private TwitterAuth auth;
private String CONSUMER_KEY = "", CONSUMER_SECRET = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    auth = new TwitterAuth(CheckLib.this, CONSUMER_KEY, CONSUMER_SECRET);
    setContentView(R.layout.activity_main);
    cus = (Button) findViewById(R.id.cusbutton);
    cus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            auth.doLogin();
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    auth.onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onResume() {
    super.onResume();
}

@Override
protected void onDestroy() {
    super.onDestroy();
}
 }

这里我会得到回调方法的结果

   public void success(Result<TwitterSession> twitterSessionResult) {} 
                          **or**
           public void failure(TwitterException e) {}

如何将此结果(成功/失败)传递给活动 CheckLib 以执行进一步操作?

任何帮助将不胜感激:)

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以在TwitterAuth.class 中设置成功或失败的侦听器,然后在您的活动(CheckLib.class)中设置此侦听器以在成功或失败时通知您,如下所示:

    public class TwitterAuth {
    private TwitterLoginListener listener;
    public void setListener( TwitterLoginListener listener){
         this.listener = listener;    
    }
    
    Interfase TwitterLoginListener{
        public void success(Result<TwitterSession> twitterSessionResult);
        public void failure(TwitterException e);
    } 
    .
    . 
    .
    

    在成功和失败方法中需要填写监听器:

    在成功方法中(在 TwitterAuth.class 中):

    if(listener != null){
        listener.success(twitterSessionResult);
    }  
    

    在失败方法中(在 TwitterAuth.class 中):

    if(listener != null){
        listener.failure(e);
    } 
    

    然后在您的活动集侦听器中:

    .
    .
    .
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    auth = new TwitterAuth(CheckLib.this, CONSUMER_KEY, CONSUMER_SECRET);
    auth.setListener(new TwitterLoginListener{
    
         @Override
         public void success(Result<TwitterSession> twitterSessionResult){
            //login success
         }
    
         @Override
         public void failure(TwitterException e){
            //login failed
         }
    }); 
    .
    .
    .
    

    【讨论】:

    • 谢谢。是的,还有另一种方法,正如@Kelevandos 所说,您可以使用 EventBus。如果您搜索谷歌,您可以找到好的库。乘坐巴士,您可以注册更多课程(二、三、四、...)并在事件发生时通知他们。如果此答案对您有帮助,您能否将此答案标记为已接受答案。
    • 当然他们应该在 Bus 上注册自己并在工作完成后取消注册,Bus 的一个很好的用法是在 Service 和 Activity 回调中
    【解决方案2】:

    如果它是原始类型,例如布尔值或字符串(好吧,这不是原始类型,但仍然如此),您可以将其作为额外的 Intent 传递给您发送到活动的 Intent。

    如果它是一个更复杂的对象,或者您的课程中没有 Context 访问权限,请尝试使用 greenrobot EventBus,这是一个非常酷的库,专为此类情况而创建。

    【讨论】:

      【解决方案3】:
         You can use interface  and implement  the interface method from your dologin method
      
      
          check my sample
      
          public interface sampleInterface {
              // you can define any parameter as per your requirement
              public void yourMethod(boolean value);
          }
      
      
          public void doLogin(sampleInterface si) {
      
                public void publishTweet(String tweet) {
                 sampleInterface sampleIn;
              service = Twitter.getInstance().getApiClient().getStatusesService();
              service.update(tweet, null, null, null, null, null, null, null, new Callback<Tweet>() {
                  @Override
                  public void success(Result<Tweet> tweetResult) {
                      Toast.makeText(context, "Tweet Updated !",
                              Toast.LENGTH_SHORT).show();
                  si.yourMethod(true);
                  }
      
                  @Override
                  public void failure(TwitterException e) {
                      Toast.makeText(context, "Error occured !",
                              Toast.LENGTH_SHORT).show();
                      si.yourMethod(false);
                  }
              });
              }
          }
      
      
          inside your activity class
      
                  public void onClick(View v) {
                      auth.doLogin(new sampleInterface() {
                          @Override
                          public void yourMethod(boolean value) {
                              //GET your result
                          }
                      });
                  }
      

      【讨论】:

        猜你喜欢
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 2023-04-03
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多