【问题标题】:Hide a ProgressDialog once data is loaded加载数据后隐藏 ProgressDialog
【发布时间】:2013-11-27 03:49:09
【问题描述】:

在我的 android 应用程序中,我有一个 MainActivity。它有一个EditText 和一个Button。用户输入他的推特句柄并按下按钮。启动IntentService,它检索用户的推文,然后将第一条推文返回给BroadcastReceiver

由于加载推文需要时间,我想在加载推文完成之前显示一个加载器。

我在按钮单击侦听器中使用以下代码来显示加载对话框

ProgressDialog progress = new ProgressDialog(MainActivity.this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.show();

但我不知道加载完成后如何隐藏它。

下面是MainActivityIntentServiceBroadcastReceiver的代码

MainActivity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    analyze = (Button)findViewById(R.id.analyze);
    twitter_username = (EditText)findViewById(R.id.twitter_username);
    analyze.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            ProgressDialog progress = new ProgressDialog(MainActivity.this);
            progress.setTitle("Loading");
            progress.setMessage("Wait while loading...");
            progress.show();
            Intent i = new Intent(MainActivity.this , TwitterChecker.class);
            i.putExtra("username", twitter_username.getText().toString());
            startService(i);

        }});


}

IntentService

public class TwitterChecker extends IntentService {
    public TwitterChecker(){
        super("TwitterChecker");
    }

@Override
protected void onHandleIntent(Intent intent) {
    String username = intent.getStringExtra("username");
    TwitterAuthenticator authenticator = TwitterAuthenticator.getInstance();
    String accessToken = null;
    try {
        accessToken = authenticator.authenticate();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (AuthenticationException e) {
        e.printStackTrace();
    }
    Twitter tweets = FetchTweets.fetch(accessToken , username);
    Log.i("Info" , "IntentService started");
    Intent tweet = new Intent("com.kaysush.action.TWEET");
    tweet.putExtra("tweet", tweets.get(0).getText());
    sendBroadcast(tweet); // Once loaded the tweet is sent to the Receiver

}

}

广播接收器 公共类 TweetsReceiver 扩展 BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.i("TWEET RECEIVED" , intent.getStringExtra("tweet"));
             //Once loading is done a toast is shown
     Toast.makeText(context, intent.getStringExtra("tweet"), Toast.LENGTH_LONG).show();
}

}

【问题讨论】:

    标签: android broadcastreceiver progressdialog intentservice


    【解决方案1】:

    加载数据后隐藏 ProgressDialog

    您可以做到,但您需要使用的不是静态的而是动态的 BroadcastReceiver。所以这里是解决方案:

    首先,在您的 Activity BroadcastReceiver 中动态注册

    private void registerReceiver() {
       receiver = new BroadcastReceiver() {
    
          @Override
          public void onReceive(Context context, Intent intent) {
             if (intent.getAction().equals(Const.LOADING_COMPLETE_ACTION)) {
                if (dlg != null) {
                   dlg.dismiss();
                }
             }
          }
       }
    
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction(Const.LOADING_COMPLETE_ACTION);
    
       registerReceiver(receiver, intentFilter);
    }
    

    然后在您的 IntentService 中,您只需发送 Broadcast

    sendBroadcast(new Intent(Const.LOADING_COMPLETE_ACTION));
    

    注意:还要在 Activity 范围内定义 ProgressDialog 变量,以便从 onReceive() 方法访问它。

    【讨论】:

      【解决方案2】:
      ProgressDialog progress;  // Make global
      

      分配 onClick 监听器

      progress = new ProgressDialog(MainActivity.this);
      

      然后在回调方法onReceive()中

      progress.cancel();
      

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        相关资源
        最近更新 更多