2016-07-09 6 views
0

Ich habe eine Frage, die ich nicht lösen kann.Android - put Daten in Array in asynctask

Ich versuche, die 'Frage' und 'Antwort' in das 2D-Array zu bringen, aber es kann die Daten nicht in das 2D-Array in der asyncTask einfügen.

Ich erwarte, dass ich die "Frage" und "Antwort" setzen kann, die JSON-Objekt in das 2D-Array bekommen. Und dann verwenden Sie das Array in OnCreate Methode.

public class MainActivity extends Activity { 
    String[][] array = new String[10][4]; 
    private TextView tvData; 
    int qnum = 1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     String quest; 
     String ans; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new JSONTask().execute("http://itdmoodle.hung0530.com/ptms/questions_ws.php"); 
     Button btnNext = (Button) findViewById(R.id.btnNext); 
     tvData = (TextView) findViewById(R.id.textView); 
     for(int i=0;i<10;i++){ 
      int z = i+1; 
      array[i][0] = String.valueOf(z); 
     } 
     quest = array[0][1]; 
     ans = array[0][2]; 
     tvData.setText(quest); 
     btnNext.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
      } 
     }); 
    } 
    public class JSONTask extends AsyncTask<String, String, String>{ 
     @Override 
     protected String doInBackground(String... params) { 
      HttpURLConnection conn = null; 
      BufferedReader reader = null; 
      try{ 
       URL url = new URL(params[0]); 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.connect(); 
       InputStream stream = conn.getInputStream(); 
       reader = new BufferedReader(new InputStreamReader(stream)); 
       StringBuffer buffer = new StringBuffer(); 
       String line =""; 
       while((line = reader.readLine()) != null){ 
        buffer.append(line); 
       } 
       String Json = buffer.toString(); 
       JSONObject jsonObject = new JSONObject(Json); 
       JSONArray jsonArray = jsonObject.getJSONArray("Questions"); 
       StringBuffer bufferQues = new StringBuffer(); 
       StringBuffer bufferAns = new StringBuffer(); 
       for(int i=0;i<jsonArray.length();i++) { 
        JSONObject otherJson = jsonArray.getJSONObject(i); 
        String question = otherJson.getString("question"); 
        String answer = otherJson.getString("answer"); 
        bufferQues.append(question); 
        bufferAns.append(answer); 
        array[i][1] = bufferQues.toString(); 
        array[i][2] = bufferAns.toString(); 
       } 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } finally{ 
       if(conn != null){ 
        conn.disconnect(); 
       } 
       try{ 
        if(reader != null){ 
         reader.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(String result){ 
      super.onPostExecute(result); 
     } 
    } 
} 
+0

Es wäre besser, wenn Sie anstelle des Hochladens von Bildern Ihres Codes den Code eingeben. Der Editor bietet Formatierungsoptionen für Codes. –

+0

Es tut mir leid, dass ich den Code nicht eingeben konnte, wenn ich eine Frage stelle –

+0

Bearbeiten Sie Ihre Frage, entfernen Sie die Bilder, kopieren Sie Ihren Code, wählen Sie Ihren Code und klicken Sie Strg + k (cmd + k, wenn Sie verwenden Mac). –

Antwort

0

Asynctask wird asynchron ausgeführt. Sie können lange Ausführungsvorgänge für einen Hintergrundthread ausführen (doInBackground wird für einen separaten Thread als Hauptthread ausgeführt) und die Ergebnisse verwenden, um Vorgänge im Hauptthread auszuführen (onPostExecute wird im Hauptthread ausgeführt). Was Sie wollen, ist die Operation auf Ihrem 2D-Array in OnPostExecute und nicht in OnCreate durchzuführen.

+0

Die onClick-Methode kann in onPostExecute verwendet werden? –

+0

OnClick kann in onCreate festgelegt werden. Es wird beim Klicken auf die Schaltfläche aufgerufen. Sie müssen nur setText in onPostExecute tun, da Sie den Text nur dann haben. – user3215142

+0

Das bedeutet, dass alle meine Funktion in den OnPostExecute einschließlich der 2D-Arrays Daten schreiben sollte? –