定義內部類 繼承 AsyncTask 來實現非同步網路請求
阿新 • • 發佈:2018-12-08
//非同步任務處理 //建立內部類,來實現網路非同步請求 //新建內部類 繼承 AsyncTask @SuppressLint("StaticFieldLeak") class RequestNetworkDataTask extends AsyncTask<String,Integer,String> { @Override protected void onPreExecute() { super.onPreExecute(); textView.setText("載入中"); //主執行緒 } @Override protected String doInBackground(String[] strings) { String result = requestData(strings[0]); return result; //子執行緒,需要非同步執行的命令在此執行 } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); //主執行緒 //非同步程式碼處理完後,在主執行緒中進行進一步操作 } }
在需要呼叫這個自定義內部類的地方使用以下程式碼
String url = getEditTextUrl();
new RequestNetworkDataTask().execute(url);
下面是通過EditText 獲取輸入的網址
通過點選Button 在下方的TextView中顯示網址對應的網站原始碼
public class NetworkActivity extends AppCompatActivity implements View.OnClickListener { private EditText editText; private Button btn; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_network); initView(); btn.setOnClickListener(this); } private void initView() { editText = findViewById(R.id.act_network_url_et); btn = findViewById(R.id.act_network_getNet_btn); textView = findViewById(R.id.act_network_show_tv); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.act_network_getNet_btn: String url = getEditTextUrl(); new RequestNetworkDataTask().execute(url); break; } } private String getEditTextUrl() { return editText != null ? editText.getText().toString() : ""; } private String requestData(String urlString) { try { URL url = new URL(urlString); //開啟Url HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //設定超時時間 connection.setConnectTimeout(5000); //設定請求方法 connection.setRequestMethod("GET"); //開始請求 connection.connect(); int response = connection.getResponseCode(); //請求的訊息 String reponseMessage = connection.getResponseMessage(); InputStream inputStream = connection.getInputStream(); Reader reader = new InputStreamReader(inputStream, "UTF-8"); char[] buffer = new char[1024 * 8]; reader.read(buffer); String content = new String(buffer); return content; } catch (IOException e) { e.printStackTrace(); } return null; } //非同步任務處理 //建立內部類,來實現網路非同步請求 @SuppressLint("StaticFieldLeak") class RequestNetworkDataTask extends AsyncTask<String,Integer,String> { @Override protected void onPreExecute() { super.onPreExecute(); textView.setText("載入中"); //主執行緒 } @Override protected String doInBackground(String[] strings) { String result = requestData(strings[0]); return result; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); //主執行緒 } } }