0

こんにちは私はMySQLデータベースにアクセスするログインページを作成しています。しかし、私はActivity常に、終了する前に失敗/成功をチェックするコードを実行しますAsyncTask

メソッドを使用してみasynctask.get()ましたが、UIがフリーズし、機能しません。

内で結果チェッカーメソッドを呼び出す必要があるというこの回答を試しましonPostExecute()た。

しかし、成功/失敗を表示するようにTextViewを変更する必要があるNullPointerExceptionため、内部でTextViewをインスタンス化するために結果になりますonCreate()

TextViewのインスタンス化はコンストラクターに移動できません。これは、を返すためですNullPointerException unable to instantiate activity ComponentInfo

Login.java

public class Login extends Activity{

    //declare global Views here

    protected void onCreate(Bundle bundle){
        //Setup views
    }

    protected void onClick(View v){
        //Setup necessary variables
        AsyncClass async = new AsyncClass(this);
        async.execute(username, password);
    }

    public void checkSuccess(boolean success){
        if(success)
            textView1.setText("Success");
        else
            textView1.setText("Failed");
    }
}

AsyncClass.java

public class AsyncClass extends AsyncTask<String, String, JSONObject>{
    protected JSONObject doInBackground(String... params){
        //access database
    }

    protected void onPostExecute(JSONObject json){
        //read the json result
        Login login = new Login();
        login.checkSuccess(true);
    }
}

解決策はありますか?ありがとう

4

4 に答える 4

3

AsyncTaskを内部クラスとして作成するのはどうですか?

したがって、コードは次のようになります。

public class Login extends Activity {

    //declare global Views here

    protected void onCreate(Bundle bundle) {
        //Setup views
    }

    protected void onClick(View v) {
        new AsyncClass().execute(username, password);
    }

    public void checkSuccess(boolean success) {
        if (success) textView1.setText("Success");
        else textView1.setText("Failed");
    }

    class AsyncClass extends AsyncTask < String, String, JSONObject > {
        protected JSONObject doInBackground(String...params) {
            //access database
        }

        protected void onPostExecute(JSONObject json) {
            checkSuccess(true / false);
        }
    }
}
于 2012-12-10T09:33:04.257 に答える
2

これを試して

protected void onPostExecute(JSONObject json){
    //read the json result
    Login login = (Login)context; // object that you pass to task constructor
    login.checkSuccess(true);
}

また、タスクに進行状況ダイアログを追加して、ジョブの実行を示すこともできます

public class BaseTask<T> extends AsyncTask<Object, Void, T> {

public Context context;
public ProgressDialog dialog;

public BaseTask(Context context) {
    this.context = context;
    this.dialog = new ProgressDialog(context);
}

@Override
protected void onPreExecute() {
    this.dialog.setMessage(context.getResources().getString(R.string.loading));
    this.dialog.show();

}

@Override
protected T doInBackground(Object... objects) {
    //....
    return something;
}

@Override
protected void onPostExecute(T result) {
    if (dialog != null && dialog.isShowing())
        dialog.dismiss();
    // do something
}

}

于 2012-12-10T09:28:43.197 に答える
2

非同期タスクスレッドからUIを編集することはできません。UIスレッドを更新するには、onProgressUpdate()メソッドを使用します。このメソッドはAsyncTaskクラスの一部であり、実際にはメインUIスレッドで実行されます(非同期タスクはパブリックとして宣言されているため、ネストされたクラスとして使用することをお勧めします。変更する必要があります)。onProgressUpdate()メソッドは、非同期タスク内でpublishProgress(...)を呼び出すと、OS自体によって呼び出されます。

小さなサンプル:

protected JSONObject doInBackground(String... params){
    publishProgress("test");
}

    /**
     * This method is part of the Async Task
     */
    protected void onProgressUpdate(String... progress) {
        login.checkSuccess(true);
    }   
于 2012-12-10T09:37:35.107 に答える
1

私はそれをこのように使用します。必要な場所でonPostExecuteをオーバーライドするか、独自のインターフェイスを作成します。

//create a object f your asyncclass and 
//override the onPostExecute where you need it
mInfo = new ASYNCCLASS({
   @Override
   public void onPostExecute(Object result){
      //doSomething something with your views!

  }
}).execute();

Asynctaskが終了するまでにかかる時間がわからないため、待機は答えではありません。上記のコードはテストされておらず、pseudoceだけですが、私が何を意味するかを示しているはずです。

ここに私のIDEを置いてはいけないので、必要に応じて誰かが角かっこを修正するのであれば、それは素晴らしいことです。

グリーツ

于 2013-11-12T14:00:14.760 に答える