2016-06-13 5 views
0

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();    

} 
+0

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

+1

Ü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. –

+0

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

Antwort

0

eine Schnittstelle erstellen mit einem Verfahren mit einem ArrayAdapter als Parameter ..

implementieren es auf SecondActivity ..

Rufen Sie die Interface-Methode, die Sie in der OnPostExecute von BackGroundPickingTask mit dem arrayAdapter als Parameter erstellt ..

Listenansicht in der implementierten Methode auf SecondActivity Bestücken ..

und das ist es

0
public interface TaskInterface{ 
    void onLoadingCompleted(); 
} 

SecondActivity.java Ihrer Ansicht nach machen visibility zu invisible in Ihnen xml standardmäßig. AysncTask Anruf mit

new BackgroundPickingTask(new TaskInterface(){ 
    @Override 
    public void onLoadingCompleted(){ 
     yourButton.setVisibility(View.VISIBLE); 
    } 
} 
)).execute(); 

In Ihrem AsyncTask hinzufügen paramtered Konstruktor

public class BackgroundPickingTask extends AsyncTask<String, String, String> { 
private TaskInterface taskInterface; 
public BackgroundPickingTask(TaskInterface task) { 
     super(); 
     taskInterface = task 
    } 
+0

Wenn Sie die Sichtbarkeit standardmäßig auf unsichtbar setzen, bleibt sie unsichtbar. Gibt es eine Möglichkeit, es in die Listenansicht zu laden, wenn ich auf die Schaltfläche klicke, um zur zweiten Aktion zu gelangen? Auf diese Weise ist es bevölkert und schneller, wenn Sie zur nächsten Aktivität gehen – refugio