2012-06-03 3 views
0

Я получаю ошибку keydispatchingtimedout и не могу найти причину. Любая помощь? Как вы можете видеть, я создал класс сервера, с которым должен подключаться мой андроид, когда он запускается, и что он делает. Но при попытке получить данные, которые поступают из моей базы данных mysql, она зависает.таймаут отправки

import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.net.InetSocketAddress; 
import java.net.Socket; 
import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 


public class TutorialActivity extends Activity { 

    private Socket socket; 
    private ObjectInputStream dos; 
    private DataInputStream dis; 


    public void connect(){ 
     socket = new Socket(); 
     InetSocketAddress ipPort = new InetSocketAddress("192.168.0.10",4444); 
     try{ 
      socket.connect(ipPort); 
      dis = new DataInputStream(socket.getInputStream()); 
      dos = new ObjectInputStream(socket.getInputStream()); 
     }catch(Exception e){ 
      Log.d("OUT_CON",e.toString()); 
     } 

     while (true) { 
      try { 
       String msg = dis.readUTF(); 
       if (msg.equals("Hej")) { 
        Thread.sleep(50); 
        receiveArrayList(); 
       } 

      } catch (Exception e) { 
      } 
     } 
    } 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     final Button sButton = (Button) findViewById(R.id.sbutton); 
     sButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){    
      connect(); 
      } 
     }); 
    } 

    public void receiveArrayList() { 
     try { 
      FileInputStream fis = new FileInputStream("randomList"); 
      dos = new ObjectInputStream(fis); 
      ArrayList a= (ArrayList) (dos.readObject()); 
      for(int i = 0; i < a.size(); i++){ 
       Log.d((String)a.get(i), null); 
      } 

      dis.close(); 
     } catch (ClassNotFoundException ex) { 
      System.out.println(ex); 
     } catch (IOException ex) { 
      System.out.println(ex); 
     } 
    } 
} 

import java.io.DataOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Server implements Runnable { 

    private ServerSocket server; 
    private Socket socket; 
    private ObjectOutputStream oos = null; 

    public Server() { 
     try { 
      server = new ServerSocket(4444); 
      new Thread(this).start(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    public void run() { 
     System.out.println("Server running"); 
     while (true) { 
      try { 
       socket = server.accept(); 
       sayHi(); 
      } catch (Exception e) { 
      } 
     } 
    } 

    private void sayHi(){ 
     DataOutputStream dos; 
     try { 
      dos = new DataOutputStream(socket.getOutputStream()); 
      oos = new ObjectOutputStream(socket.getOutputStream()); 
      dos.writeUTF("Hej"); 
      sendNames(); 
     } catch (IOException ex) { 
      Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void sendNames() { 
     final ArrayList<String> drinkar = new ArrayList<String>(); 

     Connection con = null; 
     String url = "jdbc:mysql://localhost:3306/"; 
     String db = "drycker"; 
     String driver = "com.mysql.jdbc.Driver"; 
     String user = "root"; 
     String pass = ""; 

     try{ 
      Class.forName(driver).newInstance(); 
      con = DriverManager.getConnection(url+db, user, pass); 
      try{ 
       Statement st = (Statement) con.createStatement(); 
       ResultSet res = st.executeQuery("SELECT * FROM drinkar"); 
       while (res.next()) { 
        String s = res.getString("Namn"); 
        drinkar.add(s); 
       } 
       System.out.println(drinkar); 
       con.close(); 
      } 
      catch (SQLException s){ 
       System.out.println("SQL code does not execute."); 
      } 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     }   
     ArrayList<String> a = new ArrayList<String>(); 
     a.add("Hejsan"); 
     a.add("Svejsan"); 

     try { 
      FileOutputStream fos = new FileOutputStream("randomList"); 
      oos = new ObjectOutputStream(fos); 
      oos.writeObject(drinkar); 
      oos.flush(); 
      oos.reset(); 
      oos.close(); 
      fos.close(); 
     } catch (Exception e) { 
     } 
    } 

    public static void main(String[] args) { 
     new Server(); 
    } 
} 

ответ

0

Ваш призыв к connect() в onClick() принимает долго. Вам нужно сделать метод connect() вне основного потока. Для получения дополнительной информации обратитесь к Android developer guide.

Смежные вопросы