0

最近、Android アプリのアクティビティで AsyncTask を使用する必要がありました。そのため、アクティビティ内にクラスを作成し、そのクラスで AsyncTask を拡張しました。

しかし今では、その特定のアクティビティを起動するたびに、アプリがすぐにクラッシュします。アクティビティ全体onCreate()を try、catch ブロックに入れてみましたが、例外は発生しませんでした。LogCat に何の説明もなく、そのアクティビティを起動するとすぐにアプリがクラッシュします。

これは、上記の AsyncTask クラスを追加した後に発生し始めました。また、アクティビティの起動時に AsyncTask 部分は実行されず、ボタンを押すと実行されます。何がうまくいかないのですか?以下の関連コードを追加しました。

public class ListViewA extends Activity{

    public void onCreate(Bundle savedInstanceState) {try{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv= (ListView)findViewById(R.id.listview);
        //computation
    }

    private String[] top() {
        new RetreiveFeedTask().execute(ctr,ctz);
        return er;
    }

    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
        String[] q;

        protected String[] doInBackground(Context... params) {
            //computation
        }

        protected void onPostExecute() {
            er=q;
            gff=true;
        }
    }

編集: LogCat で重要と思われるエラーを見つけました:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.exampleapp/com.example.exampleapp.ListViewA}: java.lang.NullPointerException
4

3 に答える 3

0

私はprivate class ReadFilesTask extends AsyncTask<String, Void, String>自分のプログラムに を持っています。
その下には
protected void onPreExecute()、 、
protected String doInBackground(String... params)、および があり
protected Void onPostExecute(String result)ます。
最初の 2 つは@Overrideそれらの上にあります。私が実際に使用しているのはdoInBackground. 最初に本当に に追加@OverrideしてみdoInBackground()ます。次に、 に変更ContextしてみStringます。

編集:
アクティビティを取得する機能もありません。繰り返しますが、これは私が自分のコードで行っていることと、オンラインで見たいくつかの例です。

 
public RetreiveFeedTask(Activity アクティビティ) {

this.activity = activity;

}

そんな感じ。

于 2013-05-24T20:11:21.533 に答える
0

あなたの編集は興味深いものであり、アクティビティのインスタンス化に問題があることを示唆しています。その場合、変数宣言を非常に注意深く調べます。ただし、そのコード (またはそれ以上のonCreateコード) がない場合、または logcat からの周囲の行がない場合、より具体的にすることは困難です。

@Raghunandan が言うように、AsynTask の構築方法が正しくありません。次のようにする必要があります。

public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
    String[] q;

    @Override
    protected String[] doInBackground(Context... params) {
        //computation
        return result; // result is of type String[]
    }

    protected void onPostExecute(String[] result) {
        // do something with result ...
        er=q;
        gff=true;
    }
}

2 番目のポイントはtop()、 を返す関数erです。AsyncTask が完了するまで待ってから、AsyncTaskerによって計算された を返したいと思います。ただし、現時点で行うことは、AsyncTask を設定してからすぐに戻るerことです。AsyncTask が完了するのを待ちません。

これを実現するには、おそらくボタンを押すアクションを 2 つのフェーズに分割する必要があります。

  1. AsyncTask を作成して実行する
  2. AsyncTask の OnPostExecute は、toperによって返された を現在使用しているコードを呼び出します。
于 2013-05-24T20:11:30.637 に答える
0
public class ListViewA extends Activity{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv= (ListView)findViewById(R.id.listview);
        //computation

        new RetreiveFeedTask().execute(ctr,ctz);
    }
    ...

    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]>{

         @Override
         protected String[] doInBackground(Context... fileName) {
             //computation
             String[] q;
             //Know that fileName is an Array
             return q
         }

         protected void onPostExecute(String[] result) {
             //do something with the result
         }
    }
...
}
于 2013-05-24T20:13:46.880 に答える