你能解释一下java.lang.Thread.interrupt()调用时会发生什么吗?
我在后台线程中运行远程音频文件获取和音频文件播放操作AsyncTask.甲Cancellable进度条示出了用于提取操作运行的时间.
我想AsyncTask在用户取消(决定)操作时取消/中止运行.处理这种情况的理想方式是什么?
我想强制取消AsyncTask.我看到你可以像这个有效的解决方案一样使用isCancelled()(它在引擎盖下使用AtomicBoolean.
但是我看到了像suspiciousSolution1,suspiciousSolution2,suspiciousSolution3这样的解决方案,其中引入了新的标志private boolean isTaskCancelled = false;.
我开始想知道 - 因为那个标志被修改了
public void cancelTask(){
isTaskCancelled = true;
}
Run Code Online (Sandbox Code Playgroud)
它在某些线程上运行,并被读入
protected Void doInBackground( Void... ignoredParams ) {
//Do some stuff
if (isTaskCancelled()){
return;
}
}
Run Code Online (Sandbox Code Playgroud)
在WorkerThread中运行,然后标志不应该isTaskCancelled是volatile(或者像Google的实现中的AtomicBoolean).
multithreading android volatile synchronized android-asynctask
我的应用程序中有一个AsyncTask:
public class myActivity extends Activity {
private static Socket mySocket;
private static InputStream myInputstream;
private AsyncTask task;
private boolean connected = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
task = new UpdateTask().execute();
...
}
private class myTask extends AsyncTask<Void, String, String> {
@Override
protected String doInBackground(Void... v) {
if(!connected) {
try {
mySocket = new Socket();
mySocket.connect(new InetSocketAddress(MYIP, MYPORT));
myInputstream = mySocket.getInputStream();
connected = true;
} catch(IOException e) { ... }
}
while(connected && !isCancelled()) {
byte[] readbyte …Run Code Online (Sandbox Code Playgroud) 在阅读本文之后,我遇到了这个问题:性能提示(特别是名为"异步加载"的部分).基本上他正在尝试保存有关行的信息以查看它是否已被回收,并且只有在行仍然可见时才设置下载的图像.这就是他如何挽救这个位置:
holder.position = position;
new ThumbnailTask(position, holder)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
Run Code Online (Sandbox Code Playgroud)
ThumbnailTask构造函数是:
public ThumbnailTask(int position, ViewHolder holder) {
mPosition = position;
mHolder = holder;
}
Run Code Online (Sandbox Code Playgroud)
在onPostExecute()中,他然后执行前面提到的检查:
if (mHolder.position == mPosition) {
mHolder.thumbnail.setImageBitmap(bitmap);
}
Run Code Online (Sandbox Code Playgroud)
我只是看不出这会给出任何结果.Holder和position在构造函数中同时设置为相同的值(holder中的位置与mPosition中的位置相同).它们在AsyncTask期间不会被更改(确实位置可能在getView()中更改,但存储在AsyncTask中作为私有成员的那些永远不会被操纵).我在这里错过了什么?
同时保存位置似乎并不是一个好的选择:我相信它不能保证是唯一的,如果我没记错,它会在滚动后重置为0.我在想正确的方向吗?
我正在AIButton我的应用程序中使用,我有一个AsyncTask在AIButton被点击后执行并接收一些命令并且AsyncTask有时需要太长时间才能执行.
这是我的代码:
final AIConfiguration config = new AIConfiguration("xxx",
AIConfiguration.SupportedLanguages.English,
AIConfiguration.RecognitionEngine.System);
listenButton = (AIButton) findViewById(R.id.micButton);
config.setRecognizerStartSound(getResources().openRawResourceFd(R.raw.test_start));
config.setRecognizerStopSound(getResources().openRawResourceFd(R.raw.test_stop));
config.setRecognizerCancelSound(getResources().openRawResourceFd(R.raw.test_cancel));
listenButton.initialize(config);
listenButton.setResultsListener(this);
Run Code Online (Sandbox Code Playgroud)
这是AsnycTask:
class translate extends AsyncTask<String, Void, String> {
String translatedText = "";
@Override
protected void onPreExecute() {
super.onPreExecute();
loading.setMessage("Loading");
loading.show();
}
@Override
protected String doInBackground(String... params) {
String text = params[0];
String toBeConvertedIn = params[1];
Log.d("TEXT", text);
Log.d("TBCI", toBeConvertedIn);
try {
String encodedText = URLEncoder.encode(text, "UTF-8");
HttpHandler httpHandler = new HttpHandler();
String url = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=xxxxxxx&text=" …Run Code Online (Sandbox Code Playgroud) 我想出如果我在中间运行AsyncTask时退出一个活动,当我再次尝试启动该活动时,我将不得不等到之前的AsyncTask在新的AsynTask启动之前完成.我尝试了thread.sleep和systemclock.sleep,它给了我相同的结果.这是有道理的,因为我猜我关闭和打开的线程是相同的.如果用户退出活动,它有一种方法可以取消AsyncTask吗?因为第二次用户输入相同的活动,他不必等到上一次完成.我在onPause()中尝试了asyntask.cancel(true),它不起作用,同样的事情发生了.
我Service在背景上运行,从互联网收集数据并使用AsyncTask它们存储Shared Preferences.即使完成工作AsyncTask仍然冻结了我的主要活动.
以下是服务代码:
public class GetterService extends Service {
SharedPreferences.Editor editor;
HashMap<Integer,String> links = new HashMap<Integer,String>();
@Override
public void onCreate() {
editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
populateLinks();
}
private void populateLinks(){
// Here I add links to HashMap
}
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "GetterService ON BIND", Toast.LENGTH_LONG).show();
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "GetterService ON DESTROY", Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) …Run Code Online (Sandbox Code Playgroud) 我有一个文件下载android应用程序.当用户点击listview项目时,下载了这个文件.它工作正常.现在,我想取消当前文件下载并启动下一个文件,同时用户点击其他项目,另一个下载已经在进行并在取消下载任务之前显示用户确认.
我怎样才能做到这一点?
提前致谢
我在类中创建了一个AsyncTask,我从一个片段调用该任务.问题是我想在片段被销毁时停止doInBackground方法.为此,我在编写AsyncTask的类中创建了一个方法,并在该方法中对Asynctask对象使用了cancel(true).当我从片段onDestroy()调用此方法时,后台进程仍在运行.Plz告诉我停止asynctask的doInBackground的正确方法.
这是编写asynctask的类
public class CarDetail implements Parcelable{
private String carId;
private String carName;
private String imageUrl;
private String thumbUrl;
private String dailyPrice;
private String weeklyPrice;
private String weekendPrice;
private String deposit;
private String minimumAge;
private String color;
private String make;
private String location;
private String bodyType;
private String fuelType;
private String transmission;
private String carType;
private String model;
private String description;
private Bitmap image;
private Bitmap thumbImage;
private CarListAdapter carAdapter;
private ImageLoadTask task = new ImageLoadTask();
public CarDetail() {
super(); …Run Code Online (Sandbox Code Playgroud)