【问题标题】:call input receiving Method inside on button click and use its values在按钮单击时调用内部输入接收方法并使用其值
【发布时间】:2017-08-17 00:11:17
【问题描述】:

我试图找到一些解决方案,但我没有找到有效的解决方案,我有两个类,一个是下载视频文件的 sysnctask 类,它工作正常 // 代码

  public class DownloadFileAsync extends AsyncTask<String, String, String> {

private Context context;

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

@Override
protected void onPreExecute() {
    super.onPreExecute();
}
protected String doInBackground(String... f_url) {
    int count;
    try {
        URL url = new URL(f_url[0]);
        URLConnection conection = url.openConnection();
        conection.connect();

        int lenghtOfFile = conection.getContentLength();

        // download the file
        InputStream input = new BufferedInputStream(url.openStream(), 8192);
        Dominika_details  dominika_details= new Dominika_details();
        // Output stream
        OutputStream output = new FileOutputStream("/sdcard/"+YOUTUBE_ID);

        byte data[] = new byte[1024];

        long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;

            publishProgress(""+(int)((total*100)/lenghtOfFile));

            // writing data to file
            output.write(data, 0, count);
        }

        // flushing output
        output.flush();

        // closing streams
        output.close();
        input.close();

    } catch (Exception e) {
        Log.e("Error: ", e.getMessage());
    }

    return null;
}

protected void onProgressUpdate(String... progress) {
    // setting progress percentage
    }
@Override
protected void onPostExecute(String file_url) {
    // dismiss the dialog after the file was downloaded
     }
      }

第二个是活动“GetYoutubeUrl”,它将youtube视频ID转换为下载的格式

//代码

    public class GetYoutubeUrl extends AppCompatActivity {
private static final String YOUTUBE_ID = "3LiubyYpEUk";
private final YouTubeExtractor mExtractor = YouTubeExtractor.create();
private Callback<YouTubeExtractionResult> mExtractionCallback = new Callback<YouTubeExtractionResult>() {
    @Override
    public void onResponse(Call<YouTubeExtractionResult> call, Response<YouTubeExtractionResult> response) {
        bindVideoResult(response.body());
    }
    @Override
    public void onFailure(Call<YouTubeExtractionResult> call, Throwable t) {
        onError(t);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_get_youtube_url);
    mExtractor.extract(YOUTUBE_ID).enqueue(mExtractionCallback);


    Button  download= (Button)findViewById(R.id.download);
    download.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {



        }
    });
}
private void onError(Throwable t) {
    t.printStackTrace();
    Toast.makeText(GetYoutubeUrl.this, "It failed to extract. So sad", Toast.LENGTH_SHORT).show();
}

private void bindVideoResult(YouTubeExtractionResult result) {
///  Here you can get download url link
    String video= String.valueOf(result.getSd360VideoUri());
    new DownloadFileAsync(this).execute(video);
}

}

在 GetYoutubeUrl 活动的 bindVideoResult 方法中,我可以调用 asynctask 类并使用“字符串视频”值作为输入很好地下载视频。 我想要完成的是两件事:

  1. 在 GetYoutubeUrl 活动中,clicklistener 上有下载按钮,所以我如何调用里面的 asynctask 类 它并使用 bindVideoResult 方法中的值“video”,这样我只能在单击按钮时下载此视频文件。

2.如何将每个视频 id 分配为下载的文件名?,我的意思是在 GetYoutubeUrl 活动中,id "YOUTUBE_ID" 是在哪里引入的
那么我怎样才能将名称添加到异步任务“OutputStream output = new FileOutputStream("/sdcard/"+YOUTUBE_ID);"

// 日志猫

W/dalvikvm: threadid=1: thread exiting with uncaught exception  (group=0x41ebd9c0)
    E/AndroidRuntime: FATAL EXCEPTION: main
              android.view.WindowManager$BadTokenException: Unable to add      window -- token null is not for an application
                   at   android.view.ViewRootImpl.setView(ViewRootImpl.java:650)
                  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
                  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
                  at android.app.Dialog.show(Dialog.java:281)
                  at com.fredycom.myyoutube.DownloadFileAsync.onPreExecute(DownloadFileAsync.java:41)
                  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
                  at android.os.AsyncTask.execute(AsyncTask.java:534)
                  at com.fredycom.myyoutube.GetYoutubeUrl$2.onClick(GetYoutubeUrl.java:43)
                  at android.view.View.performClick(View.java:4212)
                  at android.view.View$PerformClick.run(View.java:17476)
                  at android.os.Handler.handleCallback(Handler.java:800)
                  at android.os.Handler.dispatchMessage(Handler.java:100)
                  at android.os.Looper.loop(Looper.java:194)
                  at android.app.ActivityThread.main(ActivityThread.java:5371)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:525)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
                  at dalvik.system.NativeStart.main(Native Method)

I/Process:发送信号。 PID:21771 SIG:9 应用程序终止。

【问题讨论】:

    标签: android android-activity methods android-asynctask


    【解决方案1】:

    仅在单击按钮时下载此视频文件。

    String video 声明为全局变量。并在按钮的onClick()中调用 AsyncTask

        download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DownloadFileAsync(this).execute(video);
            }
        });
    

    如何将每个视频 ID 分配为下载的文件名? 将您的 YOUTUBE_VIDEO_ID 作为 AsyncTask 参数的参数传递 -

    public class DownloadFileAsync extends AsyncTask<String, String, String> {
    
        private Context context;
        private String youtubeId;
    
        public DownloadFileAsync(Context context, String youtubeId){
            this.context = context;
            this.youtubeId = youtubeId; // Use youtubeId as file name
        }
    
        .....
    }
    

    你会打电话给asyncTask 喜欢 -

    new DownloadFileAsync(this, YOUTUBE_VIDEO_ID).execute(video);
    

    【讨论】:

    • 我引入了新的 DownloadFileAsync(this,YOUTUBE_ID).excute(video);在点击侦听器旁边并减少修改它,如 DownloadFileAsync(Mainactivity.this,YOUTUBE_ID).excute(video);,当我运行它时强制关闭此 logcat 错误@Wizard
    • 然后呢?问题解决了吗?
    • @F.joel 请在您的问题中使用错误 logcat 更新您的代码,每个人都可以查看!
    • 尚未修复@Wizard 特别是按钮点击区域
    • 感谢@Wizard,在根据您的建议对我的代码进行了一些修改后,没有更改任何代码,终于可以正常工作了
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多