1
private class GetLinks extends AsyncTask<String, Void, String> {
    private EasyYoutubeDownloader myUrl = null;
    private String dls = "";

    protected String doInBackground(String... urls) {
        // works

        try {
            myUrl = new EasyYoutubeDownloader(
                    "http://www.youtube.com/watch?v=jhFDyDgMVUI");
        } catch (Exception e) {

        }

        return "";

    }

    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {


        showDownloadLinks.setText(myUrl.getAvailabledyoutubedownloads().get(0).getDladdress());

    }
}

getAvailableyoutubedownloads は、文字列で満たされた arrayList を返します。

これは動作しません。ログ cat は、リストに何もないことを示していますが、コンソールでこのプログラムを実行すると、6 つの文字列が出力されます。非同期タスクに何か問題がありますか?

リストが作成される前に onPostExecute が実行されていると思います。

使用する結果を返す必要があることはわかっていますが、現在デバッグ中です。

リクエストに応じてプログラム全体。

import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    private EditText youtubeUrl;
    private Button getDownloadUrls;
    private TextView showDownloadLinks;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        youtubeUrl = (EditText) findViewById(R.id.editText1);
        youtubeUrl.setText("http://www.youtube.com/watch?v=jhFDyDgMVUI");
        getDownloadUrls = (Button) findViewById(R.id.button1);
        showDownloadLinks = (TextView) findViewById(R.id.textView1);
        getDownloadUrls.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new GetLinks().execute(youtubeUrl.getText().toString());

            }
        });
    }

    private class GetLinks extends AsyncTask<String, Void, String> {
        private EasyYoutubeDownloader myUrl = null;
        private String dls = "";

        protected String doInBackground(String... urls) {
            // works

            try {
                myUrl = new EasyYoutubeDownloader(
                        "http://www.youtube.com/watch?v=jhFDyDgMVUI");
            } catch (Exception e) {

            }

            return "";

        }

        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {


            showDownloadLinks.setText(myUrl.getAvailabledyoutubedownloads().get(0).getDladdress());

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;

    }
}

ログキャット

06-18 22:33:08.940: E/Trace(14828): error opening trace file: Permission denied (13)
06-18 22:33:08.940: D/ActivityThread(14828): setTargetHeapUtilization:0.25
06-18 22:33:08.940: D/ActivityThread(14828): setTargetHeapIdealFree:8388608
06-18 22:33:08.940: D/ActivityThread(14828): setTargetHeapConcurrentStart:2097152
06-18 22:33:09.070: D/libEGL(14828): loaded /system/lib/egl/libEGL_adreno200.so
06-18 22:33:09.070: D/libEGL(14828): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
06-18 22:33:09.070: D/libEGL(14828): loaded /system/lib/egl/libGLESv2_adreno200.so
06-18 22:33:09.080: I/Adreno200-EGLSUB(14828): <ConfigWindowMatch:2087>: Format RGBA_8888.
06-18 22:33:09.090: E/(14828): <s3dReadConfigFile:75>: Can't open file for reading
06-18 22:33:09.100: E/(14828): <s3dReadConfigFile:75>: Can't open file for reading
06-18 22:33:09.100: D/OpenGLRenderer(14828): Enabling debug mode 0
06-18 22:33:16.848: D/AndroidRuntime(14828): Shutting down VM
06-18 22:33:16.848: W/dalvikvm(14828): threadid=1: thread exiting with uncaught exception (group=0x41bf0438)
06-18 22:33:16.858: E/AndroidRuntime(14828): FATAL EXCEPTION: main
06-18 22:33:16.858: E/AndroidRuntime(14828): java.lang.NullPointerException
06-18 22:33:16.858: E/AndroidRuntime(14828):    at com.simpleyoutube.download.MainActivity$GetLinks.onPostExecute(MainActivity.java:60)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at com.simpleyoutube.download.MainActivity$GetLinks.onPostExecute(MainActivity.java:1)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.os.AsyncTask.finish(AsyncTask.java:631)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.os.Looper.loop(Looper.java:137)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at android.app.ActivityThread.main(ActivityThread.java:5062)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at java.lang.reflect.Method.invokeNative(Native Method)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at java.lang.reflect.Method.invoke(Method.java:511)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
06-18 22:33:16.858: E/AndroidRuntime(14828):    at dalvik.system.NativeStart.main(Native Method)

編集

このコードは null を返していると思います。以下で説明するように、Android は JVM のすべての将来をサポートしているわけではありません。ここで何が問題で、どのように修正する必要がありますか?

 public static String getHtml(String url) throws Exception {
  URL website = new URL(url);
  URLConnection connection = website.openConnection();

  BufferedReader in = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));

  StringBuilder response = new StringBuilder();
  String inputLine;

  while ((inputLine = in.readLine()) != null)
   response.append(inputLine);

  in.close();

  return response.toString();
 }

また、権限が問題になることはありません。すべての許可を追加しましたが、それでもエラーがスローされます。

4

3 に答える 3

0

HTML を取得するためのソリューション

HttpClient httpclient = new DefaultHttpClient(); // Create HTTP Client
         HttpGet httpget = new HttpGet(url); // Set the action you want to do
         HttpResponse response = httpclient.execute(httpget); // Executeit
         HttpEntity entity = response.getEntity(); 
         InputStream is = entity.getContent(); // Create an InputStream with the response
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
         StringBuilder sb = new StringBuilder();
         String line = null;
         while ((line = reader.readLine()) != null) // Read line by line
             sb.append(line + "\n");

         String resString = sb.toString(); // Result is here

         is.close(); // Close the stream
         return resString;

これは、Androidでhtmlを取得するためのソリューションです。

Androidはこれを好まないようです:

 public static String getHtml(String url) throws Exception {
  URL website = new URL(url);
  URLConnection connection = website.openConnection();

  BufferedReader in = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));

  StringBuilder response = new StringBuilder();
  String inputLine;

  while ((inputLine = in.readLine()) != null)
   response.append(inputLine);

  in.close();

  return response.toString();
 }

理由は何でも構いません。ありがとうございました。

Androidのhtmlリンクからページのhtmlソースを取得するには?

于 2013-06-19T21:21:52.480 に答える
0

try/catch で例外がスローされているかどうかをログに記録していないため、確かなことはわかりませんが、アプリがインターネットにアクセスするための適切なアクセス許可を要求していない可能性があります。これを追加する必要があります:

<uses-permission android:name="android.permission.INTERNET" /> 

アプリケーションからインターネット ベースの呼び出しを行うために、AndroidManifest.xml ファイルに追加します。それでも問題が解決しない場合は、呼び出しが実際に失敗していると思われるため、プログラムの catch ブロックに何らかのログ ステートメントを追加してください。スニピットがメイン メソッドから実行されるからといって、それが Android で実行されるとは限らないことに注意してください。android は、標準の JVM が行う機能のほぼすべてをサポートしていますが、機能が 100% 同等というわけではありません。

于 2013-06-19T05:10:21.760 に答える
0

の各コンポーネントがmyUrl.getAvailabledyoutubedownloads().get(0).getDladdress()null であることを確認し、null でshowDownloadLinksないことを確認します。

于 2013-06-19T05:33:21.323 に答える