4

私はアプリに取り組んできましたが、AsyncTaskそれが内部クラスにあるときにうまく機能するようになりました。

AsyncTaskが独自の別のクラスになるようにコードをリファクタリングしていProgressDialogますが、タスクが正常に完了したら、どうすれば を強制終了して新しいアクティビティを開始できるのでしょうか? メソッドで新しいアクティビティを開始しようとしましたが、onPostExecute(..)うまくいかないことがわかっています。


AsyncTask のコンストラクターで UI スレッド アクティビティを引数として渡してもうまくいかないようでした。

//In UI Thread I had
public class Test101 extends Activity {
    private Button btnLogin;
    private LoginTask mLoginTask;
    private Context context=this;
    private Test101 mTest101;

    mLoginTask=new LoginTask(context,mTest101);
    mLoginTask.execute(null);

    // In the AsyncTask I had
    Activity mParentActivity;

    public LoginTask(Context context,Activity act){
        this.ctx=context;
        this.mParentActivity=act;
    }

    onPostExecute(..){
        mParentActivity.callSomeMethod();
    }

    ...
}

私はNullPointerException何かを逃しているかもしれませんが、それは私にとってはうまくいきませんでした。

4

6 に答える 6

7

2 つのパラメーターを渡す代わりに、次のように 1 つだけを渡します。

public class Test101 extends Activity {
    private Button btnLogin;
    private LoginTask mLoginTask;

    mLoginTask=new LoginTask(this);
    mLoginTask.execute(); 
    //Instead of sending null put the 1st parameter of the AsyncTask as Void

AsyncTask コード:

  Activity mParentActivity;

public LoginTask(Activity act){
    this = act;
}

onPostExecute(..){
    ((Test101)mParentActivity).callSomeMethod();
}
于 2011-01-28T01:33:27.893 に答える
6

新しいアクティビティを開始するために必要なのは、のコンストラクターで渡すコンテキスト オブジェクトだけですAsyncTask

private Context ctx;
private ProgressDialog pDialog;
private String r="";

public LoginTask(Context context){
    super();
    this.ctx=context;
}

@Override
protected void onPostExecute(String result) {
    Log.i("LOGGER", "Done...");
    pDialog.dismiss();
    Intent i=new Intent(ctx,SillyActivity.class);
    ctx.startActivity(i);
}

コンストラクター内でアクティビティを渡してAsyncTask呼び出そうとするstartActivity(Intent intent)と、常に null ポインター例外が発生します。

于 2010-03-08T10:45:21.857 に答える
1
step 1 : create your master class and declare 

mNetworkMaster.runForgetAsync();

step 2: write another class for AsyncTask

package com.example.xxx;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.os.AsyncTask;

public class NetworkMaster {

    Activity mMasterActivity;
    LoadingDialog objLoadingDialog;
    Map<String, String> serverUrls = new HashMap<String,String>();


    // create a constructor
    public NetworkMaster(Activity mMasterActivity){

        this.mMasterActivity = mMasterActivity;     

    }// end constr NetworkMaster


    // Method to run the Async task
    public void runForgetAsync(){

        new ForgetPasswordAsync().execute();

    }// end runForgetAsync


    // dynamically call the thread
    public class ForgetPasswordAsync extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute(){ 
            super.onPreExecute();

        }

        protected String doInBackground(String... urls) {

            serverUrls = Ipsum.getServerUrls();     

            int response = HttpRequest.post().send("name=xxxx").code();

            return ""+response;
        }

        protected void onPostExecute(String result) {

            // return the result to master activity
            ((Login)mMasterActivity).ForgetPassword(result);            

        }

    }// end ForgetPasswordAsync

}// end NetworkMaster
于 2014-09-24T11:51:28.740 に答える
0

AsyncTaskにAndroidアノテーションを使用すると、簡単、高速、シンプルになります。

于 2012-11-26T19:01:08.840 に答える
0

Activity をコンストラクターパラメーターとして AsyncTask に渡し、それをフィールドに保持します。これは事実上、内部クラスであることで得られたものです (コンパイラだけがコードを記述します)。

于 2010-03-07T18:49:32.870 に答える
0

mTest101 が開始されていません。それはただのヌルです...だから、ヌルポインタ例外しか見ることができません。それは普通のことです。または、クラスを開始せずに静的メソッドを正常に機能させることができます。

于 2013-04-27T13:47:31.147 に答える