2016-02-21 19 views
-1

在activit-main的onCreate中,我在XMMPPConnection的構造函數中創建了一個名爲XMPPConectio的類的入口,我取得了活動主的屬性並執行一個Asychtask。在progressUpdate中我調用activity-main的triger函數。我的TRIGER功能我想給XMPPconnectio的inistance由intent.putExtra其他活動,但我得到的錯誤當將一個對象的實例發送給其他活動時,可Parcelable遇到IOException

Parcelable遇到IOException異常寫序列化對象

做這些的目的是爲了有連接(連接時)到其他活動。

請給我一些示例代碼謝謝

其實現Serializable XMPPConectio類:

public class XMPPConnectio implements Serializable { 


    XMPPTCPConnection connection; 
    String connectionMessages=""; 
    connectionXMPP connectionXMPPAsynch; 
    MainActivity mainActivity; 


    public XMPPTCPConnection getXMPPConnectio() 
    { 
     return connection; 
    } 

    public XMPPConnectio(MainActivity mainActivity) 
    { 
    this.mainActivity=mainActivity; 
    try 
    { 
     connectionXMPPAsynch =new connectionXMPP(); 
     connectionXMPPAsynch.execute(); 
    } 
    catch (Exception e) 
    { 
    } 
    } 

    class connectionXMPP extends AsyncTask<String,Void,String> 
    { 

     @Override 
     protected String doInBackground(String... params) { 


      connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder() 
      .setServiceName("192.168.1.6") 
      .setUsernameAndPassword("ehsan", "123") 
      .setPort(9090) 
      .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
      .setDebuggerEnabled(true) 
      .setCompressionEnabled(false).build()); 
      connection.setUseStreamManagement(true); 
      connection.addConnectionListener(new ConnectionListener() 
      { 

       @Override 
       public void connected(XMPPConnection connection) { 
        Log.d("connected", "yes connected successfully : "); 
        publishProgress(); 
       } 

       @Override 
       public void authenticated(XMPPConnection connection, boolean resumed) { 
        Log.d("connected","yes authenticated successfully : "); 
       } 

       @Override 
       public void connectionClosed() { 
        Log.d("connected","yes connectionClosed successfully : "); 
       } 

       @Override 
       public void connectionClosedOnError(Exception e) { 

        Log.d("connected","yes connectionClosedOnError : "); 
       } 

       @Override 
       public void reconnectionSuccessful() { 
        Log.d("connected","yes reconnection successfully : "); 
       } 

       @Override 
       public void reconnectingIn(int seconds) { 
        Log.d("connected","yes reconnectingIn : "); 
       } 

       @Override 
       public void reconnectionFailed(Exception e) { 
        Log.d("connected","yes reconnectionFailed : "); 
       } 
      }); 

      connect(); 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      mainActivity.triger(); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      Log.d("","onPostExecute"); 
     } 
     private void connect() 
     { 
     try { 

       connection.connect(); 

      } catch (SmackException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

的活動,這使得XMPPConectio的實例,並引起Asychtask執行

package passargad.ehsan; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.provider.Settings; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Serializable; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.net.Socket; 

public class MainActivity extends ActionBarActivity implements Serializable { 


    private Socket socket; 
    private String serverIpAddress = "192.168.1.6"; 
    XMPPConnectio xmppConnectio; 
    XMPPTCPConnection connection; 
    private static final int REDIRECTED_SERVERPORT = 6789; 


    FastFood fastFood; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Intent intent=new Intent(this,SocketService.class); 
     startService(intent); 

     fastFood =new FastFood(this); 

     xmppConnectio=new XMPPConnectio(this); 


    } 

// this is the function which is called (when connection is done) by //onProgressUpdate of Asychtask 

    public void triger() 
    { 


     try { 
      Intent intent= new Intent(this,chat.class); 
      intent.putExtra("XMPP",xmppConnectio); 
      startActivity(intent); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 


} 

這就是我想有XMPPConnectio在那裏活動,但執行永遠達不到這個

package passargad.ehsan; 

import android.app.Application; 
import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 

import java.io.IOException; 


public class chat extends ActionBarActivity { 
    XMPPConnectio xmppConnectio; 
    XMPPTCPConnection connection; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 


     xmppConnectio=(XMPPConnectio)getIntent().getSerializableExtra("XMPP"); 
     Log.d("","done"); 
} 
} 

我試圖使這個問題晶瑩剔透通過給所有的代碼。正如我所說的,目標是在連接連接時在所有活動中建立連接。 謝謝。

回答

0

如果我想在每個活動中都有可訪問的連接對象,其中一個解決方案是使用捆綁包並以意向方式發送捆綁包。但實際的問題是在API級別10(android 2.3)中沒有bundle選項。另一個問題是,由於XMPPTCPConnection沒有實現可序列化,因此沒有選擇使用序列化和putExtra作爲意圖的選項。所以我使用了定義靜態對象的第三個選項。

所以我改變了類XMPPConectio此

import android.app.Application; 
    import android.content.Intent; 
    import android.os.AsyncTask; 
    import android.os.IBinder; 
    import android.util.Log; 

    import org.jivesoftware.smack.ConnectionConfiguration; 
    import org.jivesoftware.smack.ConnectionListener; 
    import org.jivesoftware.smack.SmackException; 
    import org.jivesoftware.smack.XMPPConnection; 
    import org.jivesoftware.smack.XMPPException; 
    import org.jivesoftware.smack.chat.Chat; 
    import org.jivesoftware.smack.chat.ChatManager; 
    import org.jivesoftware.smack.chat.ChatManagerListener; 
    import org.jivesoftware.smack.chat.ChatMessageListener; 
    import org.jivesoftware.smack.packet.Message; 
    import org.jivesoftware.smack.tcp.XMPPTCPConnection; 
    import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; 

    import java.io.IOException; 
    import java.io.Serializable; 


    public class XMPPConnectio { 


     XMPPTCPConnection connection; 
     String connectionMessages=""; 
     connectionXMPP connectionXMPPAsynch; 
     MainActivity mainActivity; 


     public XMPPTCPConnection getXMPPConnectio() 
     { 
      return connection; 
     } 

     public XMPPConnectio(MainActivity mainActivity) 
     { 
     this.mainActivity=mainActivity; 
     try 
     { 
      connectionXMPPAsynch =new connectionXMPP(); 
      connectionXMPPAsynch.execute(); 
     } 
     catch (Exception e) 
     { 
     } 
     } 

     class connectionXMPP extends AsyncTask<String,Void,String> 
     { 

      @Override 
      protected String doInBackground(String... params) { 


       connection = new XMPPTCPConnection(XMPPTCPConnectionConfiguration.builder() 
       .setServiceName("192.168.1.6") 
       .setUsernameAndPassword("ehsan", "123") 
       .setPort(9090) 
       .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
       .setDebuggerEnabled(true) 
       .setCompressionEnabled(false).build()); 
       connection.setUseStreamManagement(true); 
       connection.addConnectionListener(new ConnectionListener() 
       { 

        @Override 
        public void connected(XMPPConnection connection) { 

         Log.d("connected","yes connected successfully : "); 
         publishProgress(); 
        } 

        @Override 
        public void authenticated(XMPPConnection connection, boolean resumed) { 
         Log.d("connected","yes authenticated successfully : "); 

        } 

        @Override 
        public void connectionClosed() { 
         Log.d("connected","yes connectionClosed successfully : "); 
        } 

        @Override 
        public void connectionClosedOnError(Exception e) { 

         Log.d("connected","yes connectionClosedOnError : "); 
        } 

        @Override 
        public void reconnectionSuccessful() { 
         Log.d("connected","yes reconnection successfully : "); 
        } 

        @Override 
        public void reconnectingIn(int seconds) { 
         Log.d("connected","yes reconnectingIn : "); 
        } 

        @Override 
        public void reconnectionFailed(Exception e) { 
         Log.d("connected","yes reconnectionFailed : "); 
        } 
       }); 

       connect(); 
       return null; 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       super.onProgressUpdate(values); 
       mainActivity.triger(); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       Log.d("","onPostExecute"); 
      } 
      private void connect() 
      { 
      try { 

        connection.connect(); 
        // connection.login(); 

       } catch (SmackException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (XMPPException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

其活性使XMPPConectio的實例,並導致Asychtask執行

package passargad.ehsan; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.provider.Settings; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Serializable; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.net.Socket; 

public class MainActivity extends ActionBarActivity { 

private Socket socket; 
private String serverIpAddress = "192.168.1.6"; 
XMPPConnectio xmppConnectio; 
public static XMPPTCPConnection connection; 
private static final int REDIRECTED_SERVERPORT = 6789; 


FastFood fastFood; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Intent intent=new Intent(this,SocketService.class); 
    startService(intent); 
    fastFood =new FastFood(this); 

    //this is 
    xmppConnectio=new XMPPConnectio(this); 



} 

public void triger() 
{ 

    connection=xmppConnectio.getXMPPConnectio(); 
    Intent intent= new Intent(this,chat.class); 
    startActivity(intent); 

} 

}

這是我們可以訪問的活動e連接

package passargad.ehsan; 

import android.app.Application; 
import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

import org.jivesoftware.smack.ConnectionListener; 
import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 

import java.io.IOException; 


public class chat extends ActionBarActivity { 
XMPPTCPConnection connection; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat); 

    //this is 
     connection=MainActivity.connection; 
     connection.addConnectionListener(new ConnectionListener() { 
      @Override 
      public void connected(XMPPConnection connection) { 
       Log.d("","connected"); 

      } 
     @Override 
     public void authenticated(XMPPConnection connection, boolean resumed) { 
      Log.d("","6"); 
     } 

     @Override 
     public void connectionClosed() { 
      Log.d("","5"); 
     } 

     @Override 
     public void connectionClosedOnError(Exception e) { 
      Log.d("","4"); 
     } 

     @Override 
     public void reconnectionSuccessful() { 
      Log.d("","3"); 
     } 

     @Override 
     public void reconnectingIn(int seconds) { 
      Log.d("","2"); 
     } 

     @Override 
     public void reconnectionFailed(Exception e) { 
      Log.d("","1"); 
     } 
    }); 
    try { 
     connection.login(); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


} 
} 
相關問題