我有一个应用程序,根据要求,从后台线程处理下载图像。根据需要,我想在下载照片的同时,显示所有活动的水平进度条。这也是负责我的应用程序的整个Json解析的类。为此,我实现了一个扩展Service的类,并调用了它的onCreate方法。但我仍然不清楚如何更新当前屏幕中的进度条,如果用户切换到其他屏幕,进度条也应该相应更新。以前我尝试过使用IntentService类,但它需要
MyService (String name){
super(name);
}
但不幸的是,这不适合我的情况,我一直在获取像'cant instantiate the default constructor of IntentService'
这样的logcat异常
我真的被这种情况困住了。如果有人遇到过这种情况,请建议我一些方法/代码片段。
这是我当前的示例代码:http://pastebin.com/HCWFPtbb
public final class DownloadThread extends Thread
{
private static final String TAG = DownloadThread.class.getSimpleName();
private Handler handler;
private int totalQueued;
private int totalCompleted;
private final DownloadThreadListener listener;
private boolean isRunning = false;
protected boolean isStop;
private TaskInitiator mtaskInitiator = null;
/**
* @return the isRunning
*/
public boolean isRunning()
{
return isRunning;
}
public DownloadThread(DownloadThreadListener listener)
{
this.listener = listener;
isStop = false;
}
@Override
public void run()
{
try
{
Looper.prepare();
mtaskInitiator = new TaskInitiator();
handler = new Handler();
isRunning = true;
Looper.loop();
}
catch (Throwable t)
{
Log.e(TAG, "DownloadThread halted due to an error", t);
}
}
public synchronized void requestStop()
{
isStop = true;
}
public synchronized void enqueueDownload(DownloadTask task)
{
mtaskInitiator = new TaskInitiator();
mtaskInitiator.setTask(task);
handler.post(mtaskInitiator);
totalQueued++;
}
public synchronized void removeTasks()
{
if (mtaskInitiator != null)
{
handler.removeCallbacks(mtaskInitiator);
totalQueued = 0;
totalCompleted = 0;
}
}
class TaskInitiator implements Runnable
{
private DownloadTask task = null;
public DownloadTask getTask()
{
return task;
}
public void setTask(DownloadTask task)
{
this.task = task;
}
public TaskInitiator()
{
// TODO Auto-generated constructor stub
}
@Override
public void run()
{
try
{
task.run();
}
finally
{
if (isStop)
{
Looper.myLooper().quit();
}
synchronized (DownloadThread.this)
{
signalUpdate(task.getCurrentBitmap(), task.getCurrentFeedUrl());
task.setCurrentBitmap(null);
totalCompleted++;
}
}
}
}
public synchronized int getTotalQueued()
{
return totalQueued;
}
public synchronized int getTotalCompleted()
{
return totalCompleted;
}
public void signalUpdate(Bitmap bmap, String bmapUrl)
{
if (listener != null)
{
listener.handleDownloadThreadUpdate(bmap, bmapUrl);
}
}
}
让您的"活动"组件实现下面的接口,以便从Thread类进行回调。
public interface DownloadThreadListener {
void handleDownloadThreadUpdate(Bitmap bmap,String bmapUrl);
Map<String, Bitmap> giveImages_Map();
ConcurrentHashMap<String, SoftReference<Bitmap>> giveSoftImages_Map();
}