1

私のウェブサイトからファイルをロードする次のコードがあります

class DownloadTT4FileTask extends AsyncTask<String, String, String> {

                    private Context mContext;
                    private String  mFilename;
                    private ProgressDialog progressDialog;
                    String  retString="";

                    public DownloadTT4FileTask(Context context, String filename) {
                        mContext=context;
                        mFilename=filename;
                    }

                    @Override
                    protected void onPreExecute() {
                        Log.d("DownloadTT4FileTask", "onPreExecute");
                        progressDialog = ProgressDialog.show(mContext, mFilename, "Loading. Please wait...");
                    }

                    protected String doInBackground(String... args) {

                        URL url;
                        try {
                            url = new URL(args[0]);
                            java.net.URLConnection con = url.openConnection();
                            con.connect();
                            //Log.d("DownloadTT4FileTask", "con.connect ok ");

                            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
                            String line;
                            for (; (line = in.readLine()) != null; ) {
                                // just read the line and save it
                                retString += line+"\n";
                            }   

                        } catch (MalformedURLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        return retString;
                    }

                    protected void onPostExecute(String result) {
                        Log.d("DownloadTT4FileTask", "onPreExecute");
                        progressDialog.dismiss();
                    }
                };
                // loading from website
                filename = "http://2112design.com/tabs/"+band+"/"+song+".tt4";
                String fileContents = new DownloadTT4FileTask(context, filename).execute(filename).get(15L, TimeUnit.SECONDS);

                br = new BufferedReader(new StringReader(fileContents));

正常に読み込まれますが (読み込みに約 5 秒かかります)、進行状況ダイアログが少しずれています。ダウンロードの開始時に画面に表示されません。タスクの最後に、画面上で短く点滅します。

これを使用する方法の多くの例を見てきましたが、これはかなり普通のコードのようです。

多分文脈が問題ですか?主なアクティビティではないフラグメントで実行されている onChildClick から取得します。メイン アクティビティ コンテキストを使用しようとしましたが、クラッシュしました。

    @Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    Globals.mDoc.OpenTT4Document(parent.getContext(), band, song, mRemoteFilesThis==null ? Doc.SDCARD : Doc.WEBSITE);

    return false;
}

何か案は?ありがとう

4

2 に答える 2

0

私はρяσόρєя Kの助けを借りてそれを理解しました、ありがとう

基本的な問題は、スレッドの読み込みを開始した onChildClick から返されなかったため、 ProgressDialog.show を実行しても、スレッドが終了するまで実際には何も実行されず、それまでには意味がありませんでした。

だから私が今していることは、取得せずにasynctaskを開始し、onPostExecuteで読み取りデータのすべての処理を行うことです。そのため、ロード関数からすぐに戻り、UI スレッドに戻り、進行状況が表示されます。

しかし、問題は、メインUIに表示する新しいドキュメントがないため、「何とか何とか何とか待っている...」というタイトルのドキュメントを表示して空にすることです。ロードが完了すると、メイン ビューが無効になり、ドキュメントが表示されます。

于 2013-02-01T10:06:27.323 に答える
0

Doc がAsyncTask.get()について述べているように:

必要に応じて、計算が完了するまで指定された時間だけ待機し、その結果を取得します。

現在、メイン UI スレッドで AsyncTask.get() を呼び出しており、進行状況ダイアログが表示されません。次のように get() メソッドを呼び出さずに AsyncTask を開始する必要があります。

new DownloadTT4FileTask(context, filename).execute(filename);

doInBackground が onPostExecute 内で完了した後に UI を次のように更新します。

                protected void onPostExecute(String result) {
                    Log.d("DownloadTT4FileTask", "onPreExecute");
                    progressDialog.dismiss();
                     // get result here
                    br = new BufferedReader(new StringReader(result));
                }

編集 :

AsyncTask の get メソッドを呼び出したい場合は、Thread を使用して結果を取得し、UI のフリーズを回避します。

new Thread(new Runnable() {
  public void run() {
     try {
            Your_Activity.this.runOnUiThread(new Runnable() {
            public void run() {

               progressDialog = ProgressDialog.show(Your_Activity.this, 
                 mFilename, "Loading. Please wait...");
            }
           });
              // start AsyncTask here
              String fileContents = new DownloadTT4FileTask(context, filename)
                                     .execute(filename).get(15L, TimeUnit.SECONDS);

              Your_Activity.this.runOnUiThread(new Runnable() {
                 public void run() {
                    // update UI elements here
                     br = new BufferedReader(new StringReader(fileContents));
                       progressDialog.dismiss();
                  }
              });
          } catch (InterruptedException e) {
           // TODO Auto-generated catch block
            e.printStackTrace();
          } catch (ExecutionException e) {
             // TODO Auto-generated catch block
               e.printStackTrace();
          } catch (TimeoutException e) {
                    // TODO Auto-generated catch block
               e.printStackTrace();
          }
       }
 }).start();
于 2013-02-01T07:54:56.807 に答える