1

ファイルを圧縮および解凍するテストアプリを作成しようとしています。ファイルの圧縮/解凍を行うためのオープンソース ライブラリを見つけましたが、ご想像のとおり、時間がかかるため、メイン UI で実行できないため、AsyncTask を使用してバックグラウンド スレッドで重い作業を行うことにしました。 、そして吐き始めただけで、終了したメッセージとすべてがうまくいくでしょう。しかし、ここで2つの大きな問題があります。ボタンを押すと、ファイルが解凍されますが、アプリがロックされ、anr画面が表示されるため、バックグラウンドスレッドではなくメインUIで実行されているように見えます。新しいスレッドは ddms ビューを使用して表示されますが、何も表示されません。待ちたいと伝えると、ファイルが解凍されます。しかし、もちろん、プログラムがフリーズしたり、私に不安を感じさせたりしたくありません。他の問題は、クリックされた直後と、aysc タスクが終了したときにボタンのテキストを更新するように設定していることです。どちらの変更も見られないので、テキストを変更して、すべての場所が異なるようにしました。また、ステータス メッセージにテキスト フィールドを設定することになっています。onPostExecute が呼び出されることはないと思います。誰かがここで何が起こっているのか教えてもらえますか?

package net.pawworks.sandbox.svc;

import java.io.File;
import net.pawworks.utils.mainlib.filetools;
import net.pawworks.utils.mainlib.zipper;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class TestserviceActivity extends Activity {
    /** Called when the activity is first created. */
    String readpath= filetools.sdcardpath()+"/ziptestin/";
    TextView readstatus;
    Button readbut;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ziptest);
        File setup = new File(filetools.sdcardpath()+"/ziptestout");
        setup.mkdir();
        setup = new File(filetools.sdcardpath()+"/ziptestin/");
        setup.mkdir();
        readstatus = (TextView)findViewById(R.id.readstatus);
        readbut = (Button)findViewById(R.id.readit);
        readbut.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v)
            {
                readbut.setText("Loading.....");
                String status="";
                // TODO Auto-generated method stub
                File setup = new File(readpath+"jpgs.zip");
                if(setup.canRead())
                {
                    status="File Readable\n";
                    new unpackit().doInBackground(new String[]{"jpgs.zip",status} );
                    readbut.setText("Read!");
                }
                else {status = "File not Readable:"+setup.toString();readstatus.setText(status);readbut.setText("Read.");}


            }
        });
       }
    private class unpackit extends AsyncTask<String, Void, String>
    {

        @Override
        protected String doInBackground(String... params) 
        {
            // TODO Auto-generated method stub
            Log.e("asynctask", "1:"+params[0]+"2:"+params[1]);
            zipper d = new zipper(readpath+"jpgs.zip",filetools.sdcardpath()+"/ziptestout/");
            d.unzip();
            return params[1]+"\n"+d.status();
        }

        @Override
        protected void onPostExecute(String result)
        {
            readstatus.setText(result);
            readbut.setText("Read?");
        }
    }
}
4

2 に答える 2

7

あなたは電話したい

new unpackit().execute(args);

doInBackground(args) ではなく。run() ではなく、スレッドで start() を呼び出すことに似ています。この場合、UI スレッドは doInBackground() のコードを実行しているだけで、他には何も呼び出していません。

詳細については、こちらのドキュメントとサンプル コードを参照してください

于 2012-04-13T01:07:44.420 に答える