создать конструктор базы данных для другого потока - PullRequest
1 голос
/ 28 апреля 2011

Для манипулирования базой данных я создал класс DBAdapter (), который расширяет SQLiteHelper ... у этого класса есть этот конструктор:

public DBAdapter(Context context) {

    super(context, DATABASE_NAME, null, 1);

    this.myContext = context;

}

Теперь он отлично работает в любой активности пакета:

DBAdapter db=new DBAdapter(this);

Я пытаюсь создать новый поток и получить доступ к базе данных из этого потока.

Проблема заключается в том, КОГДА я пытаюсь сделать

db=new DBAdapter(this); внутри этого класса он говорит мне "неправильный контекст" !!!

Должен ли я создать новый конструктор в классе DBAdapter () для моего нового класса ???два конструктора в DBAdapter () ??

Вот так выглядит мой класс:

public class WorkerRunnable implements Runnable{


public WorkerRunnable(Socket clientSocket){
    this.clientSocket=clientSocket;
}



public void run(){
    try{        
         Scanner is =new Scanner(new DataInputStream(this.clientSocket.getInputStream()));

         while (is.hasNext()) {
             longitude = is.next();

             Log.d("Longitudine:",longitude); 
             latitude=is.next();
             Log.d("Latitudine:",latitude); 

         }

        is.close();
        clientSocket.close();
            }
    catch(IOException e){
    e.printStackTrace();
    }
       }
}

Как должен выглядеть мой конструктор?Должен ли быть вызван метод run () этого класса? Thx!


public class Server1 extends Activity {

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    setContentView(R.layout.server1);
    DBAdapter db=new DBAdapter(this);

    MultiThreadedServer server = new MultiThreadedServer(6000);

    new Thread(server).start();
}

}

Как я могу передать активность Server1 потоку ????

Вот MultiThreadedServerкакие классы для WorkerRunnable:

открытый класс MultiThreadedServer реализует Runnable {

protected int serverPort=6000;

public static String SERVERIP="10.0.2.15";

protected ServerSocket serverSocket=null;

protected boolean isStopped=false;

protected Thread runningThread=null;

 public static int clientconnection = 0;

public MultiThreadedServer(int port){

    this.serverPort=port;
}


 public void run(){

        synchronized(this){

            this.runningThread = Thread.currentThread();

        }

openServerSocket();


while(!isStopped()){

    Socket clientSocket=null;

    try{
        System.out.println("Serverul asteapta clienti spre conectare");

        clientSocket=this.serverSocket.accept();

        clientconnection++;

        System.out.println("Serverul a acceptat clientul cu numarul:"+clientconnection) ;
        //Log.d("Server:","s-a acceptat un nou client");




        }
    catch(IOException e){

        if(isStopped()) {

            System.out.println("Server Stopped.") ;
            return;
        }
        throw new RuntimeException(

            "Error accepting client connection", e);

    }
      new Thread(new WorkerRunnable(clientSocket)).start();
}
  System.out.println("Server Stopped.") ;
}

 private synchronized boolean isStopped() {
        return this.isStopped;
    }

    public synchronized void stop(){
        this.isStopped = true;
        try {
            this.serverSocket.close();
        } catch (IOException e) {
            throw new RuntimeException("Error closing server", e);
        }
    }

    private void openServerSocket() {
        try {
            InetSocketAddress serverAddr =new InetSocketAddress(SERVERIP,serverPort);
            serverSocket = new ServerSocket();
            serverSocket.bind(serverAddr);
            Log.d("Server:","bind-ul a fost realizat!");
        } catch (IOException e) {
            throw new RuntimeException("Cannot open port 6000", e);
        }
    }

}

1 Ответ

1 голос
/ 28 апреля 2011

Вы можете вызвать DBAdapter db=new DBAdapter(this); в своей основной деятельности, а затем передать его в свой поток через его конструктор.
Или вы можете передать основную активность в поток (через конструктор), а затем создать DBAdapter с DBAdapter db=new DBAdapter(<activityVar>);

Edit: Итак, ваш MultiThreadedServer конструктор будет выглядеть так public MultiThreadedServer(int port, DBAdatpter db){, и вы перейдете к db из Server1. Бросьте его в глобальную переменную внутри MultiThreadedServer и передайте его WorkerRunnable через обновленный конструктор public WorkerRunnable(Socket clientSocket, DBAdapter db){.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...