마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

MyAsyncTask 실행 중 갑자기 cancel버튼으로 앱죽일경우 에러나요..

0 추천

    class MyAsyncTask extends AsyncTask<String, Void, ArrayList<String>>
    {   			
   
    	@Override
    	protected void onPreExecute(){
    		super.onPreExecute();
    	}
    	   	
    	
    	/*
    	 * 
    	 * @see android.os.AsyncTask#doInBackground(Params[])
    	 */
    	@Override
    	protected ArrayList<String> doInBackground( String... params){
    		super.onPreExecute();
    		
    		ArrayList<String> list = new ArrayList<String>();
    		
    		
    		if ( isCancelled() ) return null;
    		
         	ResultSet reset = null;
    	    Connection conn = null;

    	    try {
    	
    			    Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();    
    			    conn = DriverManager.getConnection("jdbc:jtds:sqlserver://아이피/DB","sa","PASSWORD");
    			    Statement stmt = conn.createStatement();  
    		    	
    			    reset = stmt.executeQuery(query);
    			    
    							int i=0;
    		

    							  
    							  int listsize = list.size();
    							  
    							  while(reset.next()){
    								
    								 if ( isCancelled() ) break;
    								 
    							    final String str = reset.getString(12)+" "+reset.getString(1)+" "+reset.getString(4)+" "+reset.getString(5)+" "+reset.getString(6)+" "
    							    +reset.getString(2)+" "+reset.getString(3);
    							    
    							    
    							    //Log.d("query", str);
    							   
    							    if ( listsize == 0  )					       					                	
					                	   list.add(str);
    							    else
    							    	{
    							    	list.set(i, str);
    							    	i++;
    							    	
    							    	}
    							  
    							  					  
    							}
    							  

    			    

    		            
    			    conn.close();
    	    	} 
    	    
    	    catch (Exception e)
    		    {
    		    	//Log.w("111Error connection","" + e.getMessage());
    		    }
    		
    		return list;
    	}
    
        @Override
        protected void onPostExecute(ArrayList<String> list){
        	super.onPreExecute();
        	
        	 if ( isCancelled() ) ;
        	 else{
        	
	        	ArrayAdapter<String> adapter = new ArrayAdapter<String>( getActivity(), 
	        			android.R.layout.simple_list_item_1, list);
	           	
	        	setListAdapter(adapter);
	        	 }
        	
        	handler.sendEmptyMessageDelayed(0, 1000);

        }
        
        @Override
        protected void onCancelled(){
        	super.onCancelled();
        }
    }
    

 

아래와 같은 오류가 납니다....

 

04-23 10:45:53.528: E/AndroidRuntime(12987): FATAL EXCEPTION: main
04-23 10:45:53.528: E/AndroidRuntime(12987): java.lang.NullPointerException
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
04-23 10:45:53.528: E/AndroidRuntime(12987): at com.khan.webnautes.AppleFragment_state$MyAsyncTask.onPostExecute(AppleFragment_state.java:173)
04-23 10:45:53.528: E/AndroidRuntime(12987): at com.khan.webnautes.AppleFragment_state$MyAsyncTask.onPostExecute(AppleFragment_state.java:1)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.os.AsyncTask.finish(AsyncTask.java:631)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.os.AsyncTask.access$600(AsyncTask.java:177)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.os.Handler.dispatchMessage(Handler.java:99)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.os.Looper.loop(Looper.java:137)
04-23 10:45:53.528: E/AndroidRuntime(12987): at android.app.ActivityThread.main(ActivityThread.java:4885)
04-23 10:45:53.528: E/AndroidRuntime(12987): at java.lang.reflect.Method.invokeNative(Native Method)
04-23 10:45:53.528: E/AndroidRuntime(12987): at java.lang.reflect.Method.invoke(Method.java:511)
04-23 10:45:53.528: E/AndroidRuntime(12987): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
04-23 10:45:53.528: E/AndroidRuntime(12987): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
04-23 10:45:53.528: E/AndroidRuntime(12987): at dalvik.system.NativeStart.main(Native Method)
 
익명사용자 님이 2013년 4월 23일 질문

2개의 답변

0 추천
background 작업 도중 isCancelled 가 true면 onPostExecute가 수행이 되는데 그 시점에서 어뎁터의 list가 null이라서 나는 에러라고 생각됩니다. 도중에 중단될 경우에 그 후 처리를 제대로 해주시면 될 것 같습니다.

그리고 onPostExecute에서 super.onPreExecute를 호출한 것과 if구문 뒤의 세미콜론은 오타인가요?
appa (3,380 포인트) 님이 2013년 4월 23일 답변
0 추천
        FragmentActivity a = getActivity();
        if ( a == null ) return;
         
        ArrayAdapter<String> adapter = new ArrayAdapter<String>( a, 
        android.R.layout.simple_list_item_1, list);

 

왜그런진 모르겠지만;;; 이렇게 고치니 해결되네요..

익명사용자 님이 2013년 4월 23일 답변
...