【发布时间】:2020-05-26 09:22:51
【问题描述】:
我有一个连接到 sql server 的代码,它在主线程上运行时工作得很好,但是由于连接时线程冻结,我决定将代码放在异步任务中。现在它卡在 connection.getConnection(connectionURL).. 有人知道为什么吗?
public class ConnectionClass extends AsyncTask<Void,Void,Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setCancelable(false);
progressDialog.setTitle(getString(R.string.establishing_cnxtn));
progressDialog.setMessage(getString(R.string.connecting));
progressDialog.show();
}
@Override
protected Void doInBackground(Void... voids) {
connection = DatabaseHandler.getConnection(MainActivity.this);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressDialog.dismiss();
if (connection == null)
Snackbar.make(layout, R.string.could_not_connect, Snackbar.LENGTH_LONG).show();
else {
try {
updateUI();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这是数据库代码,但我知道问题不在于这段代码...
static Connection getConnection(Context context)
{
SharedPreferences sharedPreferences = context.getSharedPreferences("ip",MODE_PRIVATE);
//ip = sharedPreferences.getString("ip","");
ip = "PC-HASSANSHOUMA"; //database ip
db = "***"; //database name
un = "***"; //username to connect to db
pass = "***"; //password to connect to db
connectionURL = null;
port = "1433";
Log.i("jsbnkjnbsjkdjk","dfdfdfdfdfd");
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Log.i("bjhbdjs","dfdfdfdfdfd");
if(connection == null)
{
try
{
Class.forName("net.sourceforge.jtds.jdbc.Driver");
Log.i("nbkjnjk","dfdfdfdfdfd");
connectionURL = "jdbc:jtds:sqlserver://"+"192.168.0.112"+"/"+db+";instance=SQL2014;user="+un+";"+"password="+pass+";";
Log.i("kjhknklnkl","dfdfdfdfdfd");
connection = DriverManager.getConnection(connectionURL);
Log.i("njknjknj","dfdfdfdfdfd");
statement = connection.createStatement();
Log.i("klklllk","dfdfdfdfdfd");
} catch (ClassNotFoundException | SQLException e) {
Log.i("nklnkl54564","dfdfdfdfdfd");
e.printStackTrace();
}
}
return connection;
}
【问题讨论】:
-
创建连接时是否有 mainActivity 或任何活动或任何上下文?如果您的 asyncTask 类是在您的活动内还是在活动外?
-
异步任务类在mainActivity内部,而数据库类是普通类而不是内部..