0

私は使用に問題がありますAsyncTask..AsyncTaskを使用しようとするとエラーが発生します..しかし、それを削除すると、すべて正常に動作します..誰かがこれに関連して私を助けることができますか?onpause()私のコードはここにあります

package co.tosca.persianpoem;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class Database_list extends Activity {

    persian_poem_class main=new persian_poem_class(this);
    public List<String> selected_databases = new ArrayList<String>();
    public ProgressDialog pd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_database_list);
        File path=new File(ClubCP.SDcardPath+"/temp/database/");
        List<String>file_lists =    main.directoryPath(path,false);
        Log.i("file_list",file_lists.toString());
        ListView Database_list=(ListView)findViewById(R.id.database_list);
        final InteractiveArrayAdapter arrayadapter=new InteractiveArrayAdapter(this,file_lists);
        Database_list.setAdapter(arrayadapter);
        Button build =(Button)findViewById(R.id.btn_build_database);
        build.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                selected_databases=arrayadapter.getSelectedItems();
                if(selected_databases.isEmpty()!=true){
                    new bulid_database().execute();

                }
                else{
                    Toast.makeText(Database_list.this, "At least select one database", 1).show();
                }
            }
        });
    }
    @Override
    public void onPause()
    {
        super.onPause();
        if(pd != null)
            pd.dismiss();
    }
    private class bulid_database extends AsyncTask<String, Long, Void> {

        // Begin - can use UI thread here
        protected void onPreExecute() {
              pd = ProgressDialog.show(Database_list.this,"","Please wait...", true,false);
        }
        // this is the SLOW background thread taking care of heavy tasks
        // cannot directly change UI
        protected Void doInBackground(final String... args) {
            // simulate here the slow activity
            main.emptyDB();
            main.creatDB(8);
            for (int i =0; i < selected_databases.size(); i++) {


                main.attachDatabase(selected_databases.get(i));
                //publishProgress((long)i);
            }
                return null;
                }
        // periodic updates - it is OK to change UI
        @Override
        protected void onProgressUpdate(Long... value) {
            pd.setMessage("still working");
        }
        // End - can use UI thread here
        protected void onPostExecute(final Void unused) {
            if (pd!=null) {
                pd.dismiss();
                }
        }
        }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.database_list, menu);
        return true;
    }

}

ここにエラーがあります

04-10 09:39:15.467: W/dalvikvm(3411): threadid=12: thread exiting with uncaught exception (group=0x2b542210)
04-10 09:39:15.497: E/AndroidRuntime(3411): FATAL EXCEPTION: AsyncTask #1
04-10 09:39:15.497: E/AndroidRuntime(3411): java.lang.RuntimeException: An error occured while executing doInBackground()
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.os.AsyncTask$3.done(AsyncTask.java:278)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.lang.Thread.run(Thread.java:856)
04-10 09:39:15.497: E/AndroidRuntime(3411): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.os.Handler.<init>(Handler.java:121)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.widget.Toast$TN.<init>(Toast.java:317)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.widget.Toast.<init>(Toast.java:91)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.widget.Toast.makeText(Toast.java:233)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at co.tosca.persianpoem.persian_poem_class.creatDB(persian_poem_class.java:224)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at co.tosca.persianpoem.Database_list$bulid_database.doInBackground(Database_list.java:65)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at co.tosca.persianpoem.Database_list$bulid_database.doInBackground(Database_list.java:1)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
04-10 09:39:15.497: E/AndroidRuntime(3411):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-10 09:39:15.497: E/AndroidRuntime(3411):     ... 5 more

ここは attach_database

public void attachDatabase(String database_name){
     Log.i("attach_database",database_name);
    //closeMyDb();
    //openMyDb();
     Db.close();
     Db = SQLiteDatabase.openDatabase(ClubCP.DbPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    try{
    String sql="attach '"+ClubCP.SDcardPath+"/temp/database/"+database_name+"' as toMerge; insert into cat select * from toMerge.cat; insert into poem select * from toMerge.poem; insert into verse select * from toMerge.verse; insert into poet select * from toMerge.poet;detach database toMerge;";
     String[] queries = sql.split(";");

          for(String query : queries){
              Db.execSQL(query);
          }
     Db.close();
    }
    catch (Exception e) 
    {
        Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.i("attach_database",e.getMessage());
    }

}

私はすでにこの同様の質問を検索して見つけましたが、それでも問題が発生 しますprogressdialog-how-to-prevent-leaked-window

4

3 に答える 3

2

メソッド内のブロックでToast表示しているために問題が発生する可能性があります。catchattachDatabase()

問題:

 catch (Exception e) 
    {
        Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.i("attach_database",e.getMessage());
    }

例外が発生するたびにメッセージrunOnUiThread()を表示する場合は、実装してカバーします。Toast

例:

runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(context, "Hello world", Toast.LENGTH_SHORT).show();
    }
});
于 2013-04-10T05:40:53.773 に答える
1

許可されていないUI呼び出し元の関数内の要素にアクセスしていますdoinbackground

catch (Exception e) 
    {
        Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.i("attach_database",e.getMessage());
    }
于 2013-04-10T05:40:03.940 に答える