密钥调度超时

时间:2012-06-03 21:03:33

标签: java android mysql multithreading android-asynctask

我得到了一个keydispatchingtimedout错误,似乎无法找到原因。有帮助吗? 正如你所看到的,我创建了一个服务器类,我的android应该在启动时连接到它,它就是这样。但是在尝试检索数据时,它来自我的数据库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();
    }
}

1 个答案:

答案 0 :(得分:0)

connect()中对onClick()的来电需要很长时间。您需要在主线程之外创建connect()方法。有关详细信息,请查看有关响应的Android developer guide