2013-01-11 28 views
0

我调整了here的教程,通过JSON从YouTube频道检索视频。一切工作正常,但我想添加ProgressDialog,而视频加载在后台线程。如果后台线程由AsyncTask处理,我知道如何添加ProgressDialog,但我不知道如何在这种情况下执行此操作。如何使用处理程序在后台线程中包装ProgressDialog?

继承人的代码的重要组成部分:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video); 

    listView = (VideosListView) findViewById(R.id.videosListView); 
    listView.setOnVideoClickListener(this); 

    getUserYouTubeFeed((VideosListView) findViewById(R.id.videosListView)); 
} 

// This is the XML onClick listener to retreive a users video feed 
public void getUserYouTubeFeed(View v){ 
    // We start a new task that does its work on its own thread 
    // We pass in a handler that will be called when the task has finished 
    // We also pass in the name of the user we are searching YouTube for 
    new GetYouTubeUserVideosTask(responseHandler, "videoslusofona").run(); 
} 

// This is the handler that receives the response when the YouTube task has finished 
Handler responseHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     populateListWithVideos(msg); 
    }; 
}; 

所以我要列出上打开的视频活动,以及最重要的是我在XML布局,使用户一键有android:onClick=getUserYouTubeFeed如果需要可以刷新。这个想法是将ProgressDialog放在某个地方,当活动开始时以及用户按下刷新按钮时,它将被激活。

如果你对我的启发我应该把ProgressDialog放在哪里,我将不胜感激。

在此先感谢。

编辑:

代码与修改整个活动由PRATIK夏尔马建议:

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 

import com.example.igestao.youtube.GetYouTubeUserVideosTask; 
import com.example.igestao.R; 
import com.example.igestao.youtube.Library; 
import com.example.igestao.youtube.Video; 
import com.example.igestao.youtube.VideoClickListener; 
import com.example.igestao.youtube.VideosListView; 

/** 
* The Activity can retrieve Videos for a specific username from YouTube</br> 
* It then displays them into a list including the Thumbnail preview and the title</br> 
* There is a reference to each video on YouTube as well but this isn't used in this  tutorial</br> 
* </br> 
* <b>Note<b/> orientation change isn't covered in this tutorial, you will want to  override 
* onSaveInstanceState() and onRestoreInstanceState() when you come to this 
* </br> 
* @author paul.blundell 
*/ 
public class MainVideoActivity extends Activity implements VideoClickListener { 
// A reference to our list that will hold the video details 
private VideosListView listView; 
ProgressDialog dialog = new ProgressDialog(MainVideoActivity.this); 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video); 

    listView = (VideosListView) findViewById(R.id.videosListView); 
    listView.setOnVideoClickListener(this); 

    getUserYouTubeFeed((VideosListView) findViewById(R.id.videosListView)); 
} 



// This is the XML onClick listener to retreive a users video feed 
public void getUserYouTubeFeed(View v){ 
    // We start a new task that does its work on its own thread 
    // We pass in a handler that will be called when the task has finished 
    // We also pass in the name of the user we are searching YouTube for 
    new VideosLoad().execute(); 
} 

// This is the handler that receives the response when the YouTube task has finished 
Handler responseHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     if (dialog.isShowing()){ 
      dialog.dismiss(); 
     } 
     populateListWithVideos(msg); 
    }; 
}; 

/** 
* This method retrieves the Library of videos from the task and passes them to our ListView 
* @param msg 
*/ 
private void populateListWithVideos(Message msg) { 
    // Retreive the videos are task found from the data bundle sent back 
    Library lib = (Library) msg.getData().get(GetYouTubeUserVideosTask.LIBRARY); 
    // Because we have created a custom ListView we don't have to worry about setting the adapter in the activity 
    // we can just call our custom method with the list of items we want to display 
    listView.setVideos(lib.getVideos()); 
} 

@Override 
protected void onStop() { 
    // Make sure we null our handler when the activity has stopped 
    // because who cares if we get a callback once the activity has stopped? not me! 
    responseHandler = null; 
    super.onStop(); 
} 

@Override 
public void onVideoClicked(Video video) { 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setData(Uri.parse(video.getUrl())); 
    startActivity(intent); 

} 

private class VideosLoad extends AsyncTask<Void, Void, String>{ 

    @Override 
    protected String doInBackground(Void... arg0){ 
     new GetYouTubeUserVideosTask(responseHandler, "videoslusofona").run(); 
     return "Executed"; 

    } 

    @Override 
    protected void onPreExecute() { 
     dialog.setMessage("Carregando Videos"); 
     dialog.show(); 
    } 

} 
} 
+0

尝试使用我发布的解决方案。 –

回答

0

所以,我终于得到它,它看起来像这样:

的的AsyncTask:在处理程序

private class VideosLoad extends AsyncTask<Void, Void, String>{ 

private Context context; 

public VideosLoad(Context context) { 
    this.context = context; 
} 

@Override 
protected void onPreExecute() { 
    dialog = ProgressDialog.show(context, "", "Loading", true); 
} 


@Override 
protected String doInBackground(Void... arg0){ 
    new GetYouTubeUserVideosTask(responseHandler, "videoslusofona").run(); 
    return "Executed"; 

} 

驳回对话框:

Handler responseHandler = new Handler() { 
public void handleMessage(Message msg) { 
    if (dialog.isShowing()){ 
     dialog.dismiss(); 
    } 
    populateListWithVideos(msg); 
}; 
}; 

而且的onCreate

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_video); 

listView = (VideosListView) findViewById(R.id.videosListView); 
listView.setOnVideoClickListener(this); 

getUserYouTubeFeed((VideosListView) findViewById(R.id.videosListView)); 

} 



public void getUserYouTubeFeed(View v){ 

new VideosLoad(this).execute(); 

} 

感谢帮助Pratik Sharma

+0

不客气。很高兴听到您解决问题。 –

0

尝试是这样的:

 Dialog = new ProgressDialog(yourActivity.this); 

     public void getUserYouTubeFeed(View v){ 
      new LongOperation().execute(); 
     } 

     // This is the handler that receives the response when the YouTube task has finished 
     Handler responseHandler = new Handler() { 
      public void handleMessage(Message msg) { 
       if (Dialog.isShowing()) { 
        Dialog.dismiss(); 
       } 
       populateListWithVideos(msg); 
      }; 
     }; 

声明这个ASYC任务是:

private class LongOperation extends AsyncTask<Void, Void, String> { 
     @Override 
     protected String doInBackground(Void... arg0) { 
      new GetYouTubeUserVideosTask(responseHandler, "videoslusofona").run(); 
      return "Executed"; 
     }  
     @Override 
     protected void onPreExecute() { 
      Dialog.setMessage("Loading"); 
      Dialog.show(); 
     } 
} 
+0

我试过了,我得到一个错误:'01-11 12:03:18.072:E/AndroidRuntime(1444):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.igestao/com.example。 igestao.MainVideoActivity}:java.lang.IllegalStateException:系统服务不可用于onCreate()之前的活动''我将编辑我的原始帖子,修改完整个活动。 – jsfrocha

+0

@jsfrocha在onCreate()方法下使用这个声明'dialog = new ProgressDialog(LayoutTest.this);'。 –

+0

@jsfrocha只在onCreate()'ProgressDialog对话框;'之前的顶部声明它。 –

相关问题