Tôi đã thử nghiệm các ví dụ khác nhau để tự làm quen với AsyncTask. Cho đến nay tất cả các ví dụ tôi đã thấy đã có AsyncTask được đưa vào phương thức onCreate của hoạt động chính. Điều mà tôi không thích lắm, vì vậy tôi muốn thấy khó khăn thế nào để tách nó thành lớp riêng của mình. Cho đến nay tôi có điều này:Phát triển Android: Có AsyncTask trong một tệp lớp riêng biệt
các hoạt động chính
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.asynctaskactivity.ShowDialogAsyncTask;
public class AsyncTaskActivity extends Activity {
Button btn_start;
ProgressBar progressBar;
TextView txt_percentage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_start = (Button) findViewById(R.id.btn_start);
progressBar = (ProgressBar) findViewById(R.id.progress);
txt_percentage= (TextView) findViewById(R.id.txt_percentage);
Log.v("onCreate","Attempt set up button OnClickListener");
btn_start.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
btn_start.setEnabled(false);
new ShowDialogAsyncTask().execute();
}
});
Log.v("onCreate","Success!");
}
}
sự riêng biệt lớp AsyncTask mới
package com.example.asynctaskactivity;
import android.os.AsyncTask;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ShowDialogAsyncTask extends AsyncTask<Void, Integer, Void>{
int progress_status;
@Override
protected void onPreExecute() {
// update the UI immediately after the task is executed
Log.v("onPreExecute","1");
super.onPreExecute();
Log.v("onPreExecute","2");
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPreExecute()", Toast.LENGTH_SHORT).show();
progress_status = 0;
Log.v("onPreExecute","3");
txt_percentage.setText("downloading 0%");
Log.v("onPreExecute","4");
}
@Override
protected Void doInBackground(Void... params) {
Log.v("doInBackground","1");
while(progress_status<100){
progress_status += 2;
publishProgress(progress_status);
SystemClock.sleep(300);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
txt_percentage.setText("downloading " +values[0]+"%");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//Toast.makeText(AsyncTaskActivity.this,"Invoke onPostExecute()", Toast.LENGTH_SHORT).show();
txt_percentage.setText("download complete");
btn_start.setEnabled(true);
}
}
Nguyên này là tất cả trong các hoạt động chính, vì thế mà đề cập đến các yếu tố mà asynctask nên trong lý thuyết cập nhật. Rõ ràng hiện nay điều này gây ra lỗi thời gian chạy, điều này khiến tôi suy nghĩ. Làm cách nào để có tệp riêng biệt nhưng vẫn cập nhật chuỗi giao diện người dùng.
Xin lỗi nếu đây là một câu hỏi ngu ngốc, hoàn toàn mới đối với các chủ đề phát triển và chủ đề nền tảng nói riêng.
Trông rất giống với luồng lưu lượng truy cập http: // này.com/questions/6119305/android-how-to-run-asynctask-from-different-class-file – user2070018
Là một sidenote, bạn không cần phải gọi các phương thức siêu trong một 'AsyncTask', chúng không làm gì cả. – nhaarman
Điểm trong chúng thực sự là gì, tôi nhận thấy chúng trong rất nhiều ví dụ về asynctask mà tôi đang xem và không thể tìm ra mục đích của chúng. – cosmicsafari