2014-04-30 1 views
0

TimerTask를 사용하여 특정 간격으로 Wi-Fi 검사 결과를 가져옵니다. 스캔 결과를 서버에 보내고 싶습니다. 결과를 보내기 위해 AsyncTask를 사용했습니다. TimerTask 내부에서 AsyncTask를 호출하면 응용 프로그램이 충돌합니다. 아무도 왜 이것이 일어나고 있는지 말해 줄 수 있습니까? 또한 내 코드에서 결과를 서버로 보내는 가장 좋은 방법은 무엇입니까? 이것은 TimerTask를의 코드timertask가 완료되면 Asynctask를 사용하여 서버와 통신하기

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 
    } 

: 여기

내 코드입니다

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 
} 
+1

응용 프로그램이 어떻게 충돌합니까? logcat에서 예외가 있습니까? –

+0

@ NicolasDefranoux 응용 프로그램에서 Wi-Fi를 사용하고 있기 때문에 전화로 직접 실행합니다. 따라서 어떤 logcat 메시지도 가지고 있지 않습니다. – Alaa

+0

왜 FileWriter를 자신의 로거로 사용합니까? asynctask에서 얼마나 멀리 나옵니까? – greenapps

답변

0

나는이 문제를 해결했다, 그래서 나는 다른 같은 직면 경우 누군가의 대답을 게시하도록하겠습니다 문제. 문제는 AsyncTaskTimerTask에서 호출되어서는 안됩니다. 핸들러는이 마찬가지로 AsyncTask를 실행하는 데 사용되어야한다

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

이이 솔루션은 this 질문에 arthvading입니다.

관련 문제