0

私は AsyncTasks の経験がほとんどないので、覚えておいてください!

Web サービスを介して外部データベースにアクセスしようとしているので、AsyncTask を使用する必要があることがわかっています。これが私のコードです。73 行目で、何らかの理由ですべてが壊れます。

ログ ファイルは次のとおりです。コードの 73 行目で例外がスローされ始めます。コードをステップ実行してデバッグしようとすると、「ソースが見つかりません」というメッセージが表示され続けます。

AsyncTasks がどのように機能するのか理解していないのかもしれませんが、67 行目以降で JSONArray オブジェクト 'json' が設定され、その行以降で使用できると想定しました...

どんな助けでも大歓迎です!

4

3 に答える 3

1

メソッドでクラスを作成しないでくださいonCreate()。クラスは常にメソッドよりも上位の構造です。

NPE bc asynctask の実行には時間がかかるため、タスクを実行してからonPostExecute()解析を行ってください。

于 2012-11-23T02:05:40.377 に答える
0

73行目b/cで失敗した場合、AsyncTaskは、使用しようとしている時点でjson変数をインスタンス化していません。AsnycTaskは別のプロセスで実行されていることを忘れないでください。json変数を使用して実行する必要がある作業はすべて、AsyncTaskのonPostExecuteメソッドで実行する必要があります。このメソッドはUIスレッドで実行されるため、そこでUI作業を行っても問題ありません。

于 2012-11-23T02:40:34.863 に答える
0

onCreate()の外部でAsyncTaskを拡張するクラスを作成します。(このシナリオだけでなく) 常にメソッドの外側にクラスを作成する必要があります (匿名の内部クラスのようないくつかのケースを除いて、もちろんそれはまた別の大きな議論です)。次に、AsyncTask クラスのオブジェクトを onCreate() メソッドで作成し、そのオブジェクトを使用してメソッドを呼び出して、そのタスクを別のスレッドで実行します。あなたのコードによると、物事を区別することはできません。doInBackground()では、別のスレッドで実行する必要があるデータを取得するコードを記述し、onPostExecute()メソッドでは、doInBackground から取得したデータを取得して UI を更新します。UI を更新するには、runOnUIThread()を使用できます。execute()以下に示すように..以下は、要件に応じた疑似コード(テストされていない)です..

public class AllEventActivity extends Activity {

    private ListView listView1;
    private String tag = "all";
    private JSONArray json;
    View header;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



                List<AllEvent> weather_data = new ArrayList<AllEvent>();
//        AllEvent weather_data[] = new AllEvent[]
//        {
//            new AllEvent(R.drawable.a, "Soccer Field"),        
//        };


                weather_data.add(new AllEvent(R.drawable.a, "a", "b", "c", "d", "e"));


        listView1 = (ListView)findViewById(R.id.listView1); //

        header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);

        new All_Events_DB_Connect().execute(new String[] {"all"});

    }

    class All_Events_DB_Connect extends AsyncTask<String, Void, JSONArray>
    {

            @Override
            protected JSONArray doInBackground(String... arg0)
            {
                    String tag = arg0[0];
                    UserFunctions u = new UserFunctions();
                    //JSONObject json = new JSONObject();
                    JSONArray json = new JSONArray();
                    try
                    {
                            json = u.getAllEvents(tag);

                    }
                    catch(Exception e)
                    {
                            Log.e("Error", e.getMessage());
                    }
                    return json;
            }
            @Override
            protected void onPostExecute(JSONArray arr)
            {
                    //returnedJson = json;
                    json = arr;

                    runOnUiThread(new Runnable() {
                        public void run() {

                             JSONObject j = new JSONObject();

                             for (int i = 0; i < json.length(); i++)
                             {
                                     try
                                     {
                                             j = json.getJSONObject(i);
                                             Toast.makeText(this, j.getString("hostName"), Toast.LENGTH_LONG).show();
                                     }
                                     catch (Exception e)
                                     {
                                             Log.e("JSON Error", e.getMessage());
                                     }
                             }


                            AllEventAdapter adapter = new AllEventAdapter(this,
                                    R.layout.listview_item_row, weather_data);

                            listView1.addHeaderView(header);

                            listView1.setAdapter(adapter);

                        }
                    });
            }
    }
}
于 2012-11-23T03:21:34.590 に答える