2017-10-06 26 views
0

林學習Android和我想打一個連接到服務,並會從那裏值的應用..如何獲得AsyncTask的返回並在活動中放置edittext?

主要活動:

public class teste extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     new api().execute(); 
    } 
} 

的AsyncTask

public class api extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... params) { 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 
     try {   
      URL url = new URL("https://randomuser.me/api/0.7"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String linha; 
      StringBuffer buffer = new StringBuffer(); 
      while((linha = reader.readLine()) != null) { 
       buffer.append(linha); 
       buffer.append("\n"); 
      } 

      return buffer.toString(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 

      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String dados) { 

    } 
} 

我該如何填寫EditTextmainactivity與從asynctask返回的值?

伊夫搜索在網絡,但C和找到工作的答案..

thankss!

拉斐爾

+0

是在睾丸中的類此類API? –

回答

1

由於您沒有爲您的EditText視圖提供代碼,請考慮下面的一段代碼並進行相應修改以適合您的情況。你需要寫上您的AsyncTask

@Override 
protected void onPostExecute(String dados) { 
    EditText simpleEditText = (EditText) findViewById(R.id.simpleEditText); //replace here with your editText's id 
    simpleEditText.setText(dados); //dados contains the result returned from the doInBackground() method 
} 

編輯的onPostExecute方法

我現在意識到,api類是從teste類不同的文件下面,所以你需要傳遞一個參考的後一個(活動)到AyncTask,api。您可以通過聲明一個構造函數做到這一點:

public class api extends AsyncTask<Void, Void, String> { 
    private Activity activity; 

    //constructor 
    public api(Activity activity) { 
     this.activity = activity; 
    } 

    //rest of your code 


    @Override 
    protected void onPostExecute(String dados) { 
     EditText simpleEditText = (EditText) activity.findViewById(R.id.simpleEditText); //replace here with your editText's id 
     simpleEditText.setText(dados); //dados contains the result returned from the doInBackground() method 
    } 

} 

,並致電apiteste

public class teste extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     new api(this).execute(); 
    } 
} 
+1

通常,AsyncTask在MainActivity類中用作InnerClasses,因此像@pleft所說的那樣,您可以使用onPostExecute中提供的代碼。 作爲初學者,我會建議你從Udacity看這個非常棒的教程https://www.udacity.com/course/new-android-fundamentals--ud851 – shadowsheep

+1

我還建議你學習AsyncTaskLoader(Loaders)和一些很好的庫,如Retrofit和RxJava。知道解決問題的多種選擇方案,有強有力的根源是非常重要的。而且...我不太喜歡AsyncTask;) – shadowsheep

+1

pleft你是那個人!感謝您的關注! –

0

你沒有。 AsyncTask的一點是它的異步。它不會返回任何東西。你不應該在一個上調用.get(),如果你這樣做,那麼使用AsyncTask就沒有意義。相反,所有需要結果的代碼都應該放在onPostExecute中。

+0

那麼你能幫我找到解決方案嗎?我只需要調用一個服務並將結果放在EditText中...... :) –

+0

您可以在onPostExecute中執行此操作。如果有必要,你會建立一個等待的UI,直到異步調用完成 –

+0

你能告訴我如何做到這一點嗎?因爲我如何訪問onPostExecute中屏幕的edittext? –

相關問題