2010-11-19 7 views
1

나는이 안드로이드의 새로운 것들에 대해 새로운 것을 인정한다. 응용 프로그램을 만들려고 노력하고 있지만 무작위로 강제 닫기 오류가 발생하며 실제로 이유를 모르겠습니다. 내 응용 프로그램에는 많은 액티비티가 있으며, 새 액티비티를 시작할 때 완료되지 않습니다. 나는 (웹 서비스와 직접 이미지 다운로드를 통해) 웹으로부터 데이터를 얻으며 AsyncTask를 많이 사용한다. 대부분 asynctask에서 충돌합니다. 다음은 내가하는 일에 대한 샘플입니다.Android 내 앱이 강제 종료되는 이유가 무엇인가요?

private BackTask backTask; 
Activity ctx = this; 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.trackslist); 

     backTask = new BackTask(); 
      backTask.execute(); 
    } 

    protected class BackTask extends AsyncTask<Context, String, myObject> 
     { 
      @Override 
      protected myObject doInBackground(Context... params) 
      { 
       try{ 
         if (hasInternet(ctx)==true) 
         { 
          //access the web SERVICE here 
         //initialize myObject WITH result FROM the web 
         return myObject 
         } 
         else 
         { 
          return null 
         } 

        }catch(Exception ex){ 
         return null; 
       } 
      } 

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

      @Override 
      protected void onProgressUpdate(String... values) 
      { 
        super.onProgressUpdate(values); 
      } 

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

      @Override 
      protected void onPostExecute(myObject result) 
      { 
        super.onPostExecute(result); 
        if (result==null || result.isEmpty()) 
        { 
          //no valid result, show a message 
        } 
        else 
        { 
         //result valid do something with it 
        } 
      } 
     } 

    @Override 
     public void onPause() 
     { 
      if (backTask!=null && ! backTask.isCancelled()) 
      { 
       backTask.cancel(true); 
      } 
      super.onPause(); 
     } 

    public void btnStartOnClick(View target) { 
      Intent intent = new Intent(this, MyNewActivity.class); 
     startActivity(intent); 
} 

활동이 onPause()가되면 작업이 취소됩니다. 나는 try/catch 동안 무슨 일이 일어 났는지 확신하지 못한다. 에러가 나타나면, 나는 null을 반환해야한다. 그러나 나는 여기서 뭔가를 놓친다 고 생각한다. 전에 말했듯이, 내가 다른 활동을하고 있어도 나는 무작위로 힘을 얻는다. 이 동작을하는 앱을 제공 할 수 없어서 정말 실망 스럽습니다. 그래서 내가 뭘 잘못하고 있니?

+0

FC가있는 경우 로그 ('adb shell logcat'명령 줄에서 sdk/tools 디렉토리 또는 Eclipse DDMS보기에서)를 확인해야합니다. 그런 다음 여기에 오류 로그를 붙여 넣으십시오. –

+0

나는 로그를 검사하고 가변적으로 asynctask에서 null 포인터 예외가 발생했다 ... 그 메시지를 받았을 때 나는 다른 활동에있다. – Alin

답변

0

당신은 isCancelled() 대한 AsyncTask 클래스 내부에 요청하고 무엇을 결정해야합니다.

체크 this question. Romain Guy의 좋은 설명이 있습니다.

AsyncTask를 중지 할 수 있습니다. cancel (true)을 호출하면 인터럽트는 이 백그라운드 스레드로 전송되며, 은 인터럽트 가능한 작업을 도울 수 있습니다. 그렇지 않으면 이 doCleaned()를 doLBackground() 메서드 에서 정기적으로 확인해야합니다. 의 코드 예는 code.google.com/p/shelves에서 확인할 수 있습니다.

2

코드에 문제가 있습니다. 나는 다음과 같이 수정했다 : 비동기 태스크를 호출하는 동안 에 추가했다. 비동기 작업이 컨텍스트를 인수로 받아 들였지만 전달하지 않았습니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.trackslist); 

    backTask = new BackTask(); 
    backTask.execute(this); 
} 
+0

나는 결코 이것을 사용하지 않았다. 호기심 나는 그것이 요청되거나 그렇지 않다면 나는 어떤 정보라도 찾을 수 없었다. 너는 조금 정성 들여서 왜 필요한가? 고맙습니다. – Alin

+0

Alin, 그럴 필요는 없습니다. Context를 첫 번째 매개 변수로 "extends AsyncTask "로 정의하여 전달해야합니다. 아무 것도 전달할 필요가 없다면 첫 매개 변수로 "무효"를 넣으십시오. –

+0

지금은 좋은 지적입니다. 그것은 흥미로운 것처럼 작동합니다. 뭔가 잘못되면 try catch에서 어떤 일이 발생합니까? onPostExecute에 null을 반환합니까? – Alin

관련 문제