0

ASynchTask で PostgreSQL データベースへの接続に問題が発生しました。正しいデータベース設定 (pg_host、pg_user など) で試してみると、動作します。問題は、getConnection() メソッドに false のパラメーターがあるため、false の設定でアクティビティを試行すると、Activity がシャットダウンすることです。しかし、ユーザーが自分のデータベースの設定を変更できるように、設定を手動で settings_activity に入れてもらいたいです。誤った設定が保存されている場合は、警告トーストが表示され、ユーザーに設定の変更を促す必要があります。アクティビティが毎回壊れるというのは間違っていますか? どうもありがとう。

コード:

1 protected void onCreate(Bundle savedInstanceState) {
2    super.onCreate(savedInstanceState);
3    setContentView(R.layout.main);
4   
5    getPrefs();
6     //.
7     //.
8     //.
9  new FetchSQL().execute();
10 }    
11
12 public void getPrefs() {
13   SharedPreferences prefs = PreferenceManager
14   .getDefaultSharedPreferences(this);
15
16   pg_host = prefs.getString("host", "HOST");
17   pg_port = prefs.getString("port", "PORT");
18   pg_database = prefs.getString("database", "DATABASE");
19   pg_user = prefs.getString("user", "USER");
20   pg_pw = prefs.getString("password", "PW");
21 }
22
23 
24  private class FetchSQL extends AsyncTask<Void,Void,String> {
25
26   @Override
27   protected String doInBackground(Void... params) {
28   String retval="";
29   try {
30   Class.forName("org.postgresql.Driver");
31   } catch (ClassNotFoundException e) {
32   e.printStackTrace();
33   retval = e.toString();
34   Toast.makeText(MainActivity.this,e.toString(), Toast.LENGTH_LONG).show();
35   }
36   String url =   "jdbc:postgresql://"+pg_host+":"+pg_port+"/"+pg_database+"";
37   Connection conn;
38   try {
39   DriverManager.setLoginTimeout(5);
40   conn = DriverManager.getConnection(url, pg_user, pg_pw);
41   Statement st = conn.createStatement();
42   String sql;
43   sql = //SQL Query
44   ResultSet rs = st.executeQuery(sql);
45   while(rs.next()) {
46 
47   //e.g var .. = rs.getString("...");
48   }
49   rs.close();
50   st.close();
51   conn.close();
52   }
53   catch (SQLException e) {
54   e.printStackTrace();
55   retval = e.toString();
56   Toast.makeText(MainActivity.this,e.toString(), Toast.LENGTH_LONG).show();
57   }
58   return retval;
59
60   }
61  
62   @Override 
63   protected void onPostExecute(String value) {
64 //Show Data from Query in textView
65 }

ログキャット:

102-14 12:21:18.707: W/System.err(2128): java.sql.SQLException: No suitable driver
202-14 12:21:18.767: W/System.err(2128): at                   java.sql.DriverManager.getConnection(DriverManager.java:182)
302-14 12:21:18.877: W/System.err(2128): at java.sql.DriverManager.getConnection(DriverManager.java:209)
402-14 12:21:18.928: W/System.err(2128): at MainActivity$FetchSQL.doInBackground(MainActivity.java:318)
502-14 12:21:18.987: W/System.err(2128): at .MainActivity$FetchSQL.doInBackground(MainActivity.java:1)
602-14 12:21:19.047: W/System.err(2128): at android.os.AsyncTask$2.call(AsyncTask.java:287)
702-14 12:21:19.099: W/System.err(2128): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
802-14 12:21:19.157: W/System.err(2128): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
902-14 12:21:19.217: W/System.err(2128): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
1002-14 12:21:19.267: W/System.err(2128): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
1102-14 12:21:19.437: W/System.err(2128): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
1202-14 12:21:19.467: W/System.err(2128): at java.lang.Thread.run(Thread.java:856)
4

1 に答える 1

0

問題は、バックグラウンドスレッドでToastを使用していることだと思います。runOnUiThread(new Runnable())を使用してみてください。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
    Toast.makeText(MainActivity.this,e.toString(), Toast.LENGTH_LONG).show();
    }
});
于 2013-02-15T10:16:10.157 に答える