我在使用时遇到问题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