0

こんにちは、SMS を削除できる Android アプリを開発しようとしています。これまでのところ、SMS を適切に削除できましたが、モバイルに大量の SMS があると、Force To Close アラート ボックスが表示されます。 UI スレッドのものなので、AsyncTask の記事を読みましたが、SMS 削除コードをどこに置くべきかを正しく理解できません。助けてください。よろしくお願いします。

ここに私の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));
            }
        });
    }
}

これが私の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);
    }
}

私を案内してください。ありがとう。

4

2 に答える 2

2

あなたの問題は、次のコード行にあります。

 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()

doInBackground 内で UI スレッドを使用することはできません。publishProgress() メソッドを使用して UI スレッドを更新できます。

于 2013-07-03T10:24:10.130 に答える
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();
    }
};


}
于 2013-07-03T10:24:55.047 に答える