-1

AsyncTask に異なる型引数を送信するにはどうすればよいですか。

J Son/php を使用して Android でログイン システムを開発しています。NetworkOnMainThread Exception が発生し、コードに AsyncTask を実装するよう提案されました。文字列とリストで URL を送信する必要があります。これを関数に送信するにはどうすればよいですか?? これらの値は他のクラスから送信されています。

public class JSONParser extends AsyncTask<String,Void,JSONObject>

私が正しいかどうかはわかりません。希望の反応。

これが私の修正です

private String url;
private List<NameValuePair> params;
@Override
protected JSONObject doInBackground(String... args) {

    return getJsonFromURL(url,params);
}

void callJson(String url,List<NameValuePair> params){
   this.url=url;
    this.params=params;
}

私はこのように AsyncTask を呼び出しています:

jsonParser=new JSONParser();
    jsonParser.setter(LoginUrl, username,password);
    try {
        jsonObject= jsonParser.execute("").get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

    return jsonObject;

今、このエラーが発生しています。

2843-2858/? E/JSON Parser﹕ Error parsing data org.json.JSONException: Value loginRegistration of type java.lang.String cannot be converted to JSONObject
    01-07 10:04:09.808    2843-2843/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: artha.ordermaking.KOT, PID: 2843
        java.lang.NullPointerException
                at 

    ex.WelcomeActivity$PlaceholderFragment.loginProcess(WelcomeActivity.java:84)
                    at ex.WelcomeActivity$PlaceholderFragment$1.onClick(WelcomeActivity.java:118)

上記で提出したコードを変更したことに注意してください。

4

5 に答える 5

0

必要なすべてのデータを含むクラスを定義し、そのクラスを AsyncTask のパラメーターとして使用できます。または、AsyncTask パラメータが煩わしい場合は、runOnUiThread とスレッドを使用できます。

class Login implements Runnable{
    public Login(parameters...){    
    }
    @Override
    public void run() {
            //Login
            runOnUiThread(new LoginResult(params...));
    }
}

class LoginResult implements Runnable{
    public Login(parameters...){    
    }
    @Override
    public void run() {
    }
}

....

new Thread(new Login()).start();
于 2014-01-13T10:07:35.827 に答える
0

スタックトレースによって証明されるように、UI スレッドでメソッドをexecute()直接呼び出すのではなく、非同期タスクを呼び出す必要があります。doInBackground()

at artha.ordermaking.KOT.library.JSONParser.doInBackground(JSONParser.java:36)
at artha.ordermaking.KOT.library.UserFunctions.loginUser(UserFunctions.java:37)

コメントから:

jsonObject=jsonParser.execute(); 動いていない。JSONObject を取得する必要があります。execute() は AsyncTask オブジェクトを返しています。

完了を待っていた場合、それは非同期タスクではありません。

代わりに、ですべての処理を行い、結果にアクセスできるdoInBackground()UI を更新します。この更新には、UI コードでのコールバック メソッドの呼び出しも含まれる場合があります。onPostExecute()doInBackground()

あなたの更新された質問で:

jsonObject= jsonParser.execute("").get();

get()は間違った解決策です。非同期タスクが完了するまで、現在のスレッド (UI スレッド) をブロックします。つまり、ネットワーク操作が UI スレッドをブロックするのを防止するという、出発点に戻りました。

于 2014-01-13T13:57:38.843 に答える
0

非同期タスクで使用される 3 つのタイプは次のとおりです。

最初の Params は、実行時にタスクに送信されるパラメーターの型です。2 番目の Progress は、バックグラウンド計算中に公開された進行状況単位のタイプです。3 番目の Result は、バックグラウンド計算の結果の型です。

AsyncTask に追加のデータを渡す必要がある場合は、AsyncTask でそのデータを受け取るメソッドを作成し、メイン UI 内で呼び出すだけです。例えば:

public void setMyHandler(Handler h) { myhandler = h; }

詳細については、AsyncTask ヘルプ ページ (こちら) を参照してください。

于 2014-01-13T09:04:37.830 に答える
0

クラスで作成ConstructorAsyncTask、データをそこにフェッチできます。

パラメータは次のとおりです。AsyncTask <TypeOfVarArgParams , ProgressValue , ResultValue> .

TypeOfVarArgParamsdoInBackground()は入力としてメソッドに渡され、ProgressValue進捗情報に使用され、メソッドResultValueから返される必要があり、パラメータとして ) にdoInBackground()渡されonPostExecute(ます。

このトピックを学習するのに、このチュートリアルが非常に役立つことがわかります。ハンドラーと AsyncTask およびローダーを使用した Android バックグラウンド処理のチュートリアル- チュートリアルは次のとおりです。

于 2014-01-13T09:04:53.387 に答える
-1

NetworkOnMainThreadException を回避する非常に簡単な方法

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
        .permitAll().build();
StrictMode.setThreadPolicy(policy);

onCreate(Bundle savedInstanceState)これらの行をアクティビティのメソッドに入れます

于 2014-01-13T09:40:16.617 に答える