0

我正在尝试从转储(这是一张地图)中获取 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 运行时,这个地图应该被更新。

但是我每次 UI 线程都在 MyHandlerMethod() 之前运行,所以 SessionStore.getFromDump("someData") 保持为空。

我如何保证在 UI 线程之前运行 Handler 线程。

它是一个列表活动。实际上我想要的是 arraylist 应该从转储中更新,我使用该数组列表进行列表活动。

4

4 回答 4

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");
     }
 }
于 2013-08-09T09:52:14.247 回答
1

您应该使用 AsyncTask 获取 Data 数据,然后更新 UI 线程。 这里参考。

于 2013-08-09T09:52:42.130 回答
1

您基本上不能在 UI 线程之前运行 HandlerThread。但是,例如,您可以在显示 ProgressDialog 时等待后台任务加载图像。我建议您使用 AsyncTask。

这是一个关于后台进程的好教程,包括 AsyncTask。

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

于 2013-08-09T09:57:19.193 回答
0

如果您不想或不能使用AsyncTask,也许您想指定Thread优先级或其他。

您可以启动HandlerThreadthen 调用getLooper()以获取它Looper,然后您可以将其传递给 aHandler以便它可以接收和处理该线程上的消息。

但是使用 anAsyncTask是简单的解决方案。

于 2013-08-09T10:04:34.723 回答