gpt4 book ai didi

安卓异步任务引用

转载 作者:行者123 更新时间:2023-11-29 21:20:15 27 4
gpt4 key购买 nike

我正在实现一个简单的下载管理器。主要 Activity 是这样的:

enter image description here

对于每个按下的下载按钮,我都会运行一个服务,该服务具有用于下载文件的异步任务并更新通知栏中的进度条。这是异步任务的代码:

class DownloadFileFromURL extends AsyncTask<String, Integer, String> {

NotificationManager manager;
NotificationCompat.Builder notificationBuilder;
String title="";
int counter = 0;
String url="";
String videoId="";
int totalSize=0;

public DownloadFileFromURL(String title,String videoId){

this.title = title;
this.videoId = videoId;
}

/**
* Before starting background thread
* Show Progress Bar Dialog
* */



@Override
protected void onPreExecute() {
super.onPreExecute();
showNotification();
ItemDownloaded itemDownloaded = new ItemDownloaded(title+".mp3", videoId, String.valueOf(totalSize));
id = db.addDownloadedItem(itemDownloaded);


}

private void showNotification(){

manager = (NotificationManager) getApplicationContext()
.getSystemService(android.content.Context.NOTIFICATION_SERVICE);


/*build the notification*/
notificationBuilder = new NotificationCompat.Builder(
getApplicationContext())
.setWhen(System.currentTimeMillis())
.setContentText("Download in progress")
.setContentTitle(title)
.setAutoCancel(false)
.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher);

notificationBuilder.setProgress(100, 0, false);
Notification notification = notificationBuilder.build();

manager.notify(title.hashCode() , notification);
}

/**
* Downloading file in background thread
* */
@Override
protected String doInBackground(String... f_url) {
this.url = f_url[0];
int count;
try {
URL url = new URL(f_url[0]);
URLConnection conection = url.openConnection();
conection.connect();
// getting file length
int lenghtOfFile = conection.getContentLength();
totalSize = lenghtOfFile;

db.updateTotalSize((int)id, String.valueOf(totalSize));


// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(), 8192);

// Output stream to write file
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory()
+ "/download/provefile/"+title+".mp3");

byte data[] = new byte[1024];

long total = 0;

while ((count = input.read(data)) != -1) {
total += count;
//actualSize = total;
// publishing the progress....
// After this onProgressUpdate will be called
if((counter == 0) || (counter >21)){
publishProgress((int)((total*100)/lenghtOfFile));
if(counter == 0)
counter++;
else
counter = 0;
}else
counter++;

// writing data to file
output.write(data, 0, count);
}

// flushing output
output.flush();

// closing streams
output.close();
input.close();

} catch (Exception e) {
Log.e("Error: ", e.getMessage());
return "ko";
}

return "ok";
}

/**
* Updating progress bar
* */
protected void onProgressUpdate(Integer... progress) {
// setting progress percentage
//progressBar.setProgress(progress[0]);
//totalLength.setText("/"+humanReadableByteCount(totalSize, true));
//actualLength.setText(humanReadableByteCount(actualSize, true));

notificationBuilder.setProgress(100, progress[0], false);

Notification notification = notificationBuilder.build();
//new Random(System.currentTimeMillis()).nextInt()
manager.notify(title.hashCode() , notification);
}

/**
* After completing background task
* Dismiss the progress dialog
* **/
@Override
protected void onPostExecute(String result) {
// dismiss the dialog after the file was downloaded

notificationBuilder.setProgress(0,0,false);


Notification notification = notificationBuilder.build();
//new Random(System.currentTimeMillis()).nextInt()
manager.notify(title.hashCode() , notification);

if(result.compareTo("ok")==0)
downloadSuccesfullComplete(title);
else
downloadError(title,url);

stopSelf();

/*notificationBuilder.setContentText("Download complete")
.setProgress(0,0,false);


Notification notification = notificationBuilder.build();
//new Random(System.currentTimeMillis()).nextInt()
manager.notify(title.hashCode() , notification);*/
}

}

这是通知栏: enter image description here

现在我想显示,当用户按下显示按钮时,在 ListView 内的另一个 Activity 中显示所有正在下载的文件(因此所有正在运行的异步任务)并显示每个文件的下载进度,如下所示: enter image description here

我该怎么办??我尝试使用数据库:异步任务的进度更新我用实际进度更新表的一列,然后在 ListView 适配器中我创建一个异步任务,它每秒执行一条选择 sql 指令并更新进度条的进度。但我认为这不是一个好的解决方案。你怎么看??

有一种方法可以保存所有正在运行的异步任务的引用,然后在 Activity 中获取它并获取 progressUpdate?我想像单例一样使用 android.Application 的子类,并在其中保存对正在运行的异步任务的所有引用。

希望我解释的好吗??非常感谢

最佳答案

您可以使用接口(interface)将状态发送到 ListView 。您可以使用这样的算法:

    • 在 asynctask 类中创建一个接口(interface),假设它有一个名为 update 的方法,其中包含您要发送的参数。
    • 在 ListView 类中实现它。
    • 在 asynctask 类中创建一个构造函数,参数为接口(interface)。例如 asyncTaskClassConstructor(myInterface reference)
    • 然后,当您要创建 asynctask 类的实例时,您可以像这样提供对构造函数的引用:new asyncTaskClassConstructor(this) etc..
    • 然后在 asynctask 的 onProgressUpdate 方法中,您应该调用我们声明的接口(interface)方法 update() 并在那里传递参数。
    • 然后在您的 ListView 类中根据需要使用它,例如使用 notifyDataSetChanged()
    • 更新 ListView

编辑后的答案 -1

如果你想知道 Asynctask 的进度,你可以声明一个带参数的接口(interface) (int progress),当你想通知进度时,只需调用 publishProgress() Asynctask 的方法,在该方法内部调用接口(interface)方法,实现该接口(interface)的类将收到通知。

编辑后的答案 -2

如果你想更新文件的进度,一个有效的方法(如我之前所说)是使用一个接口(interface),然后你在 ListView 类中实现该接口(interface)并用值更新那里的栏(参数值 假设您将 int value 作为 method )。每次您想向其他人发布进度时,只需使用您要传递的参数调用 onPublishProgress() 方法中的接口(interface)即可。

示例

在你的 asyncTask 类中你创建了一个接口(interface)让我们说 asyncTaskEvents 方法 progress(int value) 然后用接口(interface)创建一个实例变量:

 private asyncTaskEvents events;

public interface asyncTaskEvents {
public void progress(int value);
}

用接口(interface)创建一个实例变量,然后向您的构造函数添加一个参数以放置对正在等待进度的类的引用:

public DownloadFileFromURL(String title,String videoId,asyncTaskEvents event){
this.title = title;
this.videoId = videoId;
this.events = event.
}

然后在AsyncTask的onProgressUpdate方法中,调用接口(interface)传递实现它的类(在本例中为 listview 类)的当前进度:

protected void onProgressUpdate(Integer... progress) {
//Etc...
events.progress(progress);
}

然后在你的 listviewclass 中实现它,并在实现 progress(int value) 的方法中将进度更新到 progressBar,例如:

public void progress(int value){
//update progress, show message or whatever you want to do here :-)
}

您可以根据需要更改参数。 :)

关于安卓异步任务引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com