2013-07-03 3 views
0

안녕하세요. SMS를 삭제할 수있는 Android 앱을 개발하려고하는데, 지금까지 제대로 SMS를 삭제할 수 있었지만 모바일에 SMS가 많이 있었을 때 Force To Close 알림 상자가 온다, 나는 UI 스레드에서 모든 것을하고 있다는 것을 알고있다. 그래서 AsyncTask 기사를 통해 갔다. 그러나 코드를 삭제하는 나의 sms를 놓을 곳을 제대로 이해할 수 없다. 미리 도와 줘서 고마워.안드로이드에서 AsyncTask를 사용하여 SMS를 삭제하는 방법

여기 여기 저를 안내하시기 바랍니다 내 SecondClass 코드

public class SecondClass extends Activity { 
    ProgressDialog pd; 
    ProgressDialog progressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second_class); 

     new AsyncTask<Void, Void, Void>() 
     { 
      @Override 
      protected void onPreExecute() { 
       pd = ProgressDialog.show(this, "Loading..", "Please Wait", true,false); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       Cursor c = getApplicationContext().getContentResolver().query(Uri.parse("content://sms/"), null, null, null,null); 

       try 
       { 
        while (c.moveToNext()) 
        { 
         int id = c.getInt(0); 
         getApplicationContext().getContentResolver().delete(Uri.parse("content://sms/" + id), null, null); 
        } 
        //Toast.makeText(SecondClass.this, "Messages Deleted", Toast.LENGTH_SHORT).show(); 
       } 
       catch(Exception e) 
       { 
        Log.e(this.toString(),"Error deleting sms",e); 
        //Toast.makeText(SecondClass.this, "Error deleting sms", Toast.LENGTH_SHORT).show(); 
       } 
       finally 
       { 
        c.close(); 
       } 
       // TODO Auto-generated method stub 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       pd.dismiss(); 
      } 
     }.execute((Void[])null); 
    } 
} 

내 MainActivity

public class MainActivity extends Activity { 

    Button btn; 
    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(MainActivity.this,SecondClass.class)); 
      } 
     }); 
    } 
} 

입니다. 감사.

Toast.makeText(SecondClass.this, "Messages Deleted", Toast.LENGTH_SHORT).show(); 
Toast.makeText(SecondClass.this, "Error deleting sms", Toast.LENGTH_SHORT).show(); 

코드 인상이 예외 :

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

당신은 (당신은 publishProgress를 사용할 수 doInBackground 내부의 UI 스레드를 사용할 수 없습니다) 방법

+0

정당한 것처럼 보이므로 정교하게 작성하십시오. 비동기 작업이 올바르게 작동합니까? –

+0

SMS 삭제 코드를 제거하면 작동하지만, SMS 삭제 코드를 추가하면 강제 종료가 나타납니다. SMS 삭제 코드도 AsyncTask없이 제대로 작동합니다. –

+0

문제는 ** doInBackground()에서 ** Toast **를 사용하고 있습니다. 내 대답을 확인하십시오. –

답변

2

문제는 이러한 코드 라인이다 UI 스레드를 업데이트합니다.

1

같이 시도해보십시오. 아래 에서처럼 SecondClass 코드를 변경하십시오.

public class SecondClass extends Activity { 
ProgressDialog pd; 
ProgressDialog progressDialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_second_class); 

    // execute AsyncTask from here 
    new DemoAsyncTask().execute(); 

} 

// Create new AsyncTask class 
private class DemoAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected void onPreExecute() { 
      pd = ProgressDialog.show(this, "Loading..", "Please Wait", true,false); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Cursor c = getApplicationContext().getContentResolver().query(Uri.parse("content://sms/"), null, null, null,null); 

     try 
     { 
       while (c.moveToNext()) 
       { 
       int id = c.getInt(0); 
       getApplicationContext().getContentResolver().delete(Uri.parse("content://sms/" + id), null, null); 
       }    
     } 
     catch(Exception e) 
     { 
      Log.e(this.toString(),"Error deleting sms",e);    
     } 
     finally 
     { 
      c.close(); 
     } 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
      pd.dismiss(); 
    } 
}; 


} 
관련 문제