Ich versuche, eine AsyncTask zu verwenden, um Daten von einem JDBC-Treiber zu laden und diese Daten in einem multimap platzieren, die in eine Listview geladen werden dannAnruf AsyncTask aus Schaltfläche klicken und eine andere Aktivität mit Listenansicht bevölkerte starten, nachdem doInBackground abgeschlossen hat
Ich habe zur Zeit mainactivity.java mit einem Button und clicklistener (diese Schaltfläche auf mainactivity wird verwendet, um die nächste Aktivität zu starten).
Die secondactivity hat bereits eine Schaltfläche initiiert und hat auch eine Listview, die mit den Daten von backgroundpickingtask.java gefüllt ist. secondactivity.java heißt eigentlich "new BackgrounPickingTask.execute();
Das Problem, das ich habe, ist der Button bereits in secondactivity.java wird zuerst angezeigt, aber das listview dauert ein oder zwei Sekunden, bevor es auftaucht secondactivity.java.
Ich denke, es wäre am besten, die Daten von der Hauptaktivität bereit zu haben, so dass die zweite Aktivitätsschaltfläche (R.id.nextButton) beim Starten der zweiten Aktivität nicht immer die Listenansicht überbietet Aber ich habe versucht, es so gut wie möglich zu erklären. Ich würde wirklich jede Hilfe oder Vorschläge zu schätzen wissen. Ich bin etwas neu in Android-App-Entwicklung. Unten sind die Klassen.
MainActivity.class
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button pickButton = (Button) findViewById(R.id.pickButton);
View.OnClickListener pickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
MainActivity.this.startActivity(intent);
}
};
pickButton.setOnClickListener(pickListener);
}
BackGroundPickingTask.java
public class BackgroundPickingTask extends AsyncTask<String, String, String> {
private Connection conn;
private String HOST = "jdbc:postgresql://IPaddress:(port number)/";
private String DataBaseNAME = "database";
private String USERNAME = "the_username";
private String PASSWORD = "the_password";
private PreparedStatement pStmt = null;
private ResultSet rs = null;
private long rowCounter = 0;
Multimap<String, String> myMultimap = ArrayListMultimap.create();
private String sql =
"SELECT id, name, title, project from thattable"
ArrayAdapter<String> adapter;
@Override
protected void onPreExecute() {
adapter = (ArrayAdapter<String>) (SecondActivity.list.getAdapter());
}
@Override
protected String doInBackground(String... params) {
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection(
HOST + DataBaseNAME, USERNAME, PASSWORD);
//Prepares statement to execute query
pStmt = conn.prepareStatement(sql);
//Execute prepared statement
rs = pStmt.executeQuery();
//add results from sql query to multimap
while (rs.next()) {
myMultimap.put(rs.getString(1),rs.getString(2) + " (" + rs.getString(3) + " - " + rs.getString(4) + ")");
++rowCounter;
}
if (rowCounter == 0) {
//System.out.println("There are no results");
}
rs.close();
pStmt.close();
} catch(Exception e) {
e.printStackTrace();
}
//for loop to add values from each key to adapter
for (String keyz : myMultimap.keySet()) {
publishProgress(keyz);
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
//formatting my string here to organize in listview
String formattedString = "\nName (title- project):\n " + myMultimap.get(values[0]).toString()
.replace("," , "\n").trim()
.replace("[","").trim()
.replace("]","").trim();
//adding results to listview adapter
adapter.add("ID: " + values[0] + formattedString);
}
@Override
protected void onPostExecute(String values) {
}
SecondActivity.class
public class SecondActivity extends Activity {
public static ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button createWave = (Button) findViewById(R.id.nextButton);
list = (ListView) findViewById(R.id.list);
list.setAdapter(new ArrayAdapter<String>(this,
R.layout.simple_list_item_1, new
ArrayList<String>()));
new BackgroundPickingTask().execute();
}
Richten Sie einen Rückruf vom AsyncTask ersetzen, die Sie in Ihrer Tätigkeit hören und die nächste Aktivität von dort auslösen. Oder verwenden Sie eine Ladezeile und bearbeiten Sie die Einstellungen in onPostExecute(). – zgc7009
Übrigens war Android nicht wirklich dazu gedacht, JDBC-Verbindungen durchzuführen. Das Erstellen von REST-APIs und Ausführen von HTTP-Aufrufen ist der richtige Ansatz. –
Ich kann die jdbc-Verbindung jedoch problemlos herstellen. Warum sollten http-Aufrufe der richtige Ansatz sein?Ich war zweifelhaft, wenn ich zwischen jdbc und api's anfing. Ich möchte in der Lage sein, Daten aus der Datenbank zu erstellen, zu ändern und zu empfangen. – refugio