我正在尝试从dump(这是一张地图)获取json数据。所以Idea是在活动启动时后台线程读取Json数据和转储。现在,UI线程运行,并且应该从转储数据更新ArrayList。
我的代码是
Public class myclass extends ListActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyHandlerMethod();
ArrayList deals = new ArrayList(SessionStore.getFromDump("someData"));
}
MyHandlerMethod(){
//A handler thread
//Json parsing and adding data to dump runs here
}
}
// Sessionstore类有getFromDump()方法,里面有map来存储数据。
//运行MyHandlerMethod时,应该更新此地图。
但我每次在MyHandlerMethod()之前运行UI线程,因此SessionStore.getFromDump(“someData”)保持为空。
如何确保在UI线程之前运行Handler线程。
它是一个列表活动。我真正想要的是arraylist应该从dump更新,我使用该数组列表进行列表活动。
答案 0 :(得分:3)
您应该使用 AsyncTask ,并使用onProgressUpdate / publishProgress和onPostExecute方法更新您的UI。
http://developer.android.com/reference/android/os/AsyncTask.html
以下是一个如何运作的示例:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]); // here you can for example update your progress bar, your textviews, whatever UI...
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
答案 1 :(得分:1)
您应该使用AsyncTask获取数据数据,然后更新UI线程。 Here the reference.
答案 2 :(得分:1)
你基本上不能在UI线程之前运行HandlerThread。但是,您可以等待后台任务加载图像,同时显示ProgressDialog。 我建议你使用AsyncTask。
这是一个关于后台进程的好教程,包括AsyncTask。
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
答案 3 :(得分:0)
如果您不想或不能使用AsyncTask
,可能您想指定Thread
优先级或其他。
您可以启动HandlerThread
,然后致电getLooper()
以获取其Looper
,然后您可以将其传递给Handler
,以便它可以接收和处理该消息线程。
但使用AsyncTask
是一个简单的解决方案。