簡體   English   中英

如何等待直到線程在Android中完成

[英]How to wait until thread is completed in android

我有此方法updatePosts()需要在線程內運行。 看起來像這樣

public void updatePosts(){
    new Thread(){
        public void run(){
            posts.addAll(pholder.fetchPosts());
            System.out.println("size of posts is " + posts.size());

            // UI elements should be accessed only in
            // the primary thread, so we must use the
            // handler here.

        }
    }.start();
}

它實際上是在更新稱為“帖子”的列表。 我的onCreate中有這個。 問題是,由於它在單獨的線程中運行,因此在ImageAdapter需要使用“帖子”列表之前,它無法完成。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    updatePosts();
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this, posts));

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            Toast.makeText(MainActivity.this, "" + position,
                    Toast.LENGTH_SHORT).show();
        }
    });

}

我必須使用哪些選項來確保在創建ImageAdapter之前可以完成updatePosts?

您應該使用AsyncTask或任何其他機制,讓您將任務卸載到后台線程,並在完成時回調UI。

private class BackgroundTask extends AsyncTask<Void, Void, List<Post>> {

    @Override
    protected List<Post> doInBackground(Void... params) {
        // TODO
        return posts;
    }

    @Override
    protected void onPostExecute(List<Post> posts) {
        // TODO: update UI
    }
}

另一種選擇是使用RxJava,

        Observable
                .fromCallable(new Callable<List<Post>>() {
                    @Override
                    public List<Post> call() throws Exception {
                        // TODO: get posts
                        return posts;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(posts -> {
                    // TODO: update UI
                }, throwable -> {
                    // TODO
                })

我認為您需要使用Handler。

private ImageAdapter mAdapter;
private MyHandler mHandler;
private List<YourData> posts;
@Override 
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);

 GridView gridview = (GridView) findViewById(R.id.gridview);
 mAdapter = new ImageAdapter(this, posts);
 gridview.setAdapter(mAdapter);
 gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v,
                            int position, long id) {
        Toast.makeText(MainActivity.this, "" + position,
                Toast.LENGTH_SHORT).show();
    } 
 }); 
 mHandler = new MyHandler(this);
 updatePosts();
}
public void updatePosts(){ 
new Thread(){
    public void run(){ 
        posts.addAll(pholder.fetchPosts()); 
        System.out.println("size of posts is " + posts.size());
        if (mHandler != null) {
          mHandler.sendMessage(mHandler.obtainMessage(1));
         }
        // UI elements should be accessed only in 
        // the primary thread, so we must use the 
        // handler here. 

    } 
}.start();
}
private static class MyHandler extend Handler{
 private WeakReference<Your Activity name> outer;
 public MyHandler(Your Activity name activity){
     outer = new WeakReference<>(activity);
 }
 @Override
 public void handleMessage(Message msg){
     switch(msg.what){
         case 1:
             if(outer.get()!=null){
                 outer.get().mAdapter.refresh(outer.get().posts);
             }
         break;
         default:break;
     }
 }
}

在您的ImageAdapter中,您需要添加一個方法:

 public void refresh(List<YourData> dataSet){
  this.dataSet = dataSet;
  notifyDataSetChanged();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM