Связь с сервером с помощью Asynctask после завершения timertask

Я использую TimerTask, чтобы получить результат сканирования Wi-Fi с определенным интервалом. Я хочу отправить результаты сканирования на сервер. Поэтому я использовал AsyncTask для отправки результатов. Когда я вызываю AsyncTask из TimerTask, мое приложение падает. Кто-нибудь может сказать мне, почему это происходит? Также в моем коде, как лучше всего отправить результат на сервер?

Вот мой код:

public class ServerComm extends AsyncTask<String, Void, String>{

int port=9999;
String IP="192.168.2.100";
BufferedReader input;

@Override
protected String doInBackground(String... scanRes) {
    // TODO Auto-generated method stub
    Socket socket;
    String loc="";
    FileWriter writer;
    File sock=new File(Environment.getExternalStorageDirectory()+"/network.txt");
     try {
            writer = new FileWriter(sock, true);
            writer.append("in async task.\n");
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    try {
        InetAddress serverAddr = InetAddress.getByName(IP);
        socket = new Socket(serverAddr, port);// socket is created

        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        Log.d("ser","socket");

        // now send 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);       
        out.println(scanRes);                    
        // get the reply
        loc = input.readLine();
        //close
        socket.close();
        return loc;

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return loc;



}


 @Override
    protected void onPostExecute(String result) {
     // draw the new location on the map
    }

Это код TimerTask:

public void Locate()
{

    if(isScanning)// if a previous scan is running cancel it
{

    timer.cancel();
}
else
{

    timer.schedule(new TimerTask() { // start new scanner

        @Override
        public void run() {
            // TODO Auto-generated method stub

            if(counter==numOfScans)
            {

                try {

                    writer = new FileWriter(file, true);
                    writer.append(RSS+" \n");
                    writer.append("Finished Collecting RSSIs.\n");
                    writer.close();

            new ServerComm().execute(RSS);  


                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                timer.cancel();

            }
            else // not finished
            {
                isScanning=true;


                if(result!=null)
                {

                if(result.size()!=0)
                {

                    for(int i=0;i< result.size();i++)
                    {
                         RSS=RSS+result.get(i).BSSID+" "+result.get(i).level+" ";


                    }//end for


                    counter++;

                    } // end of if
                }//end of else
                }

        }
    }, 0,Interval);
}



    //get location
}

person Alaa    schedule 30.04.2014    source источник
comment
Как у вас вылетает приложение? У вас есть исключение в logcat?   -  person Nicolas Defranoux    schedule 30.04.2014
comment
@NicolasDefranoux Я запускаю его прямо на своем телефоне, потому что я использую Wi-Fi в приложении, поэтому у меня нет сообщения logcat.   -  person Alaa    schedule 30.04.2014
comment
Вот почему вы используете FileWriter в качестве собственного регистратора. Хорошо, как далеко это заходит в асинтаске?   -  person greenapps    schedule 30.04.2014
comment
@greenapps вылетает после вызова, ничего не делает в асинтаске   -  person Alaa    schedule 30.04.2014
comment
И он не падает, если вы создаете и выполняете () свою задачу, скажем, из обработчика кнопки onclick?   -  person greenapps    schedule 30.04.2014
comment
Я не пробовал, но я скопировал код асинхронной задачи в другой проект и вызвал из onCreate, и это сработало.   -  person Alaa    schedule 30.04.2014
comment
Откуда вы вызываете Locate()? Locate() является членом? Добавьте функцию, например Locate(), в которой вы только запускаете асинхронную задачу.   -  person greenapps    schedule 30.04.2014
comment
@greenapps locate вызывается при нажатии элемента на панели действий. Я добавил функцию, которая запускает только асинхронную задачу, но проблема не была решена.   -  person Alaa    schedule 30.04.2014
comment
Вы сказали, что сделали это на своем телефоне, используя Wi-Fi. Но если вы используете eclipse и подключили телефон к USB, а eclipse установил apk и запустил его, вы увидите логарифм со трассировкой стека.   -  person greenapps    schedule 30.04.2014
comment
Если проблема не решена, то теперь вы знаете, что вам нужно только взглянуть на свою асинхронную задачу. Удалите sock и все с FileWriter там.   -  person greenapps    schedule 30.04.2014
comment
Попробуйте с out.println(scanRes[0]);   -  person greenapps    schedule 30.04.2014
comment
Я использую eclipse под Linux, и мой телефон Samsung, это выполнимо?   -  person Alaa    schedule 01.05.2014


Ответы (1)


Я решил проблему, поэтому я отправляю ответ на случай, если кто-то еще столкнулся с той же проблемой. Проблема заключалась в том, что AsyncTask нельзя было вызывать из TimerTask. Обработчик должен использоваться для запуска AsyncTask Вот так:

    Handler h = new Handler(Looper.getMainLooper());
h.post(new Runnable() {
  public void run() {
    new ServerComm().execute(RSS);
  }
});

Это решение заключается в переходе на this вопрос.

person Alaa    schedule 21.07.2014