2015-04-16 3 views
6

Ich muss Twitter-Fabric wiederverwendbare Komponente erstellen.meinen ersten Schritt, um die Anmeldung mit Twitter durch Aufruf der Methode aus einer Klasse zu ermöglichen.Übergeben Sie das Callback-Methodenergebnis in einer Nicht-Aktivitätsklasse an die Android-Aktivitätsklasse?

-Code

CLASS

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); 
} 

} 

Aktivität

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(); 
} 
} 

Hier werde ich das Ergebnis auf Callback-Methode erhalten

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

Wie kann ich dieses Ergebnis (SUCCESS/FAILURE) an die Aktivität CheckLib weitergeben, um weitere Aktionen auszuführen?

jede mögliche Hilfe würde geschätzt :)

Antwort

6

können Sie Listener für Erfolg oder Misserfolg in Ihrer TwitterAuth.class gesetzt und dann diese Zuhörer in Ihrer Tätigkeit eingestellt (CheckLib.class) Sie benachrichtigen, wenn Erfolg oder Misserfolg, wie folgt aus:

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); 
} 
. 
. 
. 

in Erfolg und Misserfolg Methode müssen Zuhörer füllen:

Erfolgsmethode (in TwitterAuth.class):

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

in Ausfall Methode (In TwitterAuth.class):

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

dann in Ihrer Tätigkeit gesetzt Zuhörer:

. 
. 
. 

@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 
    } 
}); 
. 
. 
. 
+0

Ihnen danken. Ja, es gibt einen anderen Weg, wie @ Kelevandos sagte, dass Sie EventBus verwenden können. Wenn Sie Google suchen, können Sie gute Librares finden. Mit dem Bus können Sie weitere Klassen (zwei, drei, vier, ...) registrieren und sie benachrichtigen, wenn ein Ereignis eintritt. Wenn Ihnen diese Antwort hilft, können Sie diese Antwort als akzeptierte Antwort markieren. – MHP

+0

natürlich sollten sie sich auf Bus registrieren und sich selbst abmelden, wenn ihre Arbeit erledigt ist, einer der guten Nutzung von Bus ist in Service und Aktivität callBack – MHP

+0

Oki.thanks für Ihre Mühe :) –

1

Wenn es ein primitiver Typ ist, wie ein boolean oder einen String (ok, das man nicht primitiv, aber immer noch), können Sie es als Statist in einem passieren können Absicht, die Sie an die Aktivität senden.

Wenn es ein komplexeres Objekt ist oder Sie keinen Context Zugriff in Ihrer Klasse haben, versuchen Sie greenrobot EventBus, eine ziemlich coole Bibliothek, die genau für solche Situationen erstellt wurde.

0
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 
        } 
       }); 
      } 
Verwandte Themen