0

私はAndroidプログラミングに不慣れです。私はGoogleによるAndroid開発者向けドキュメントのほとんどを調べました。これが私の質問です:

私がやろうとしていること:アプリの最初のログインページから、サーバーにあるjsonファイルをフェッチし、結果を解析してログインが成功したかどうかを確認しようとしています。次のクラスのjsonを解析できません。何が悪いのか提案してください。過去数日間のstackoverflowに関する他のすべての質問を確認しましたが、あまり役に立ちませんでした。助けてください。

LoginActivity.java

package com.practice.serverdashboard;



import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.Service;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

    public EditText username;
    private EditText password;

    private static final String TAG = "MyActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        username = (EditText) findViewById(R.id.txt_username);   
        password = (EditText) findViewById(R.id.txt_password);   

        //Showing the keypad
         InputMethodManager mgr = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
         mgr.showSoftInput(username, InputMethodManager.SHOW_IMPLICIT);     
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_login, menu);
        return true;
    }


    public void callLoginService(View v)
    {
        //Hidding the keypad
        InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        mgr.hideSoftInputFromWindow(username.getWindowToken(), 0);
        mgr.hideSoftInputFromWindow(password.getWindowToken(), 0);


        String loginUrlString="http://freakageekinternaltest.com:2200/mgmt/JSP/login.jsp?userId="+username.getText()+"&pws="+password.getText();
        Log.e("log_tag", "The URL is :: "+loginUrlString);
        //calling the login URL
        //GetJson gJ=new GetJson();
        //gJ.execute(loginUrlString);
        JSONObject json=getJSONfromURL(loginUrlString);


        AlertDialog.Builder adb = new AlertDialog.Builder(
                LoginActivity.this);
                adb.setTitle("Login Service");
                adb.setMessage("Testing...");
                adb.setPositiveButton("Ok", null);
                adb.show(); 


    }



public JSONObject getJSONfromURL(String url){

    //initialize
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    //http post
    try{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    }catch(Exception e){
        Log.e("log_tag", "Error in http connection "+e.toString());
    }

    //convert response to string
    try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result=sb.toString();

        Log.e("log_tag", "result is:: "+result);

    }catch(Exception e){
        Log.e("log_tag", "Error converting result "+e.toString());
    }

    //try parse the string to a JSON object
    try{
            jArray = new JSONObject(result);
    }catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());
    }

    AlertDialog.Builder adb = new AlertDialog.Builder(
            LoginActivity.this);
            adb.setTitle("Login Service");
            adb.setMessage("Success...");
            adb.setPositiveButton("Ok", null);
            adb.show(); 

    return jArray;
}

}

logcatの出力は次のとおりです。

02-13 11:13:15.173: E/log_tag(6083): The URL is :: http://freakageekinternaltest.com:2200/mgmt/JSP/login.jsp?userId=test567&pws=test@pps
02-13 11:13:15.183: E/log_tag(6083): Error in http connection android.os.NetworkOnMainThreadException
02-13 11:13:15.183: E/log_tag(6083): Error converting result java.lang.NullPointerException: lock == null
02-13 11:13:15.183: E/log_tag(6083): Error parsing data org.json.JSONException: End of input at character 0 of 

NetworkOnMainThreadException例外(stackoverflowの助けを借りて)のために、AsyncTaskもチェックアウトしました。しかし、LoginActivity.javaクラスのどこから始めてAsyncクラスを使用するのかわかりません。助けてください。よろしくお願いします。

これが私がサーバーからフェッチして解析しようとしているjsonです:

{"LOGIN":"TRUE","userId":"Web Administrator","userAccessType":"ALL"}

@gabe:ur Earlyreplygabeのthx。バックグラウンドでネットワーク操作を行うことは必須ですか?サーバーからログインの詳細を取得しようとしているので、サーバーの応答を待っているだけのアプリはどうなりますか?また、上記のコードを考慮して、AsyncTaskクラスを実装するにはどうすればよいですか?私はuによって言及されたドキュメントを調べました。しかし、私はAsyncTaskを拡張する新しいクラスを作成しようとしました。そのクラスでは、doInBackgroundメソッドですべてのネットワーク操作を実行し、onPostExecuteメソッドを使用して結果をLoginActivity.javaクラスに送り返しました。ただし、このバックグラウンド操作はAsyncTaskクラスを拡張する新しいクラスで実行されるため、main_activity.xmlファイルで定義されているコントロールを使用できません。では、これをすべて実装するにはどうすればよいでしょうか。もう一度Thx。

またあったね!今、私は答えで提案されているように私のコードを変更しました。

private class RetreiveDataAsynctask extends AsyncTask<String,Void,JSONObject> {

        @Override
        protected JSONObject doInBackground(String... loginURL) {
            JSONObject obj = getJSONfromURL(loginURL);
            return obj;
        }

        @Override
        protected void onPostExecute(JSONObject obj) {
             //Do all ur UI related stuff as this will be executing in ui thread

            super.onPostExecute(obj);
        }


    }

そして、onCreateメソッドでは、次のように呼び出しています。

RetreiveDataAsynctask mRetreiveData = new RetreiveDataAsynctask();
        mRetreiveData.execute(loginUrlString);

しかし、この行のエラーは次のとおりです。

JSONObject obj = getJSONfromURL(loginURL);

誰かがこのコードの何が問題なのか教えてもらえますか?残りの解析関数は、上記で指定したものと同じままです。事前にThx。

4

4 に答える 4

1

エラー

Error in http connection android.os.NetworkOnMainThreadException

メインスレッドで作業を行っているが、ネットワーク操作によってユーザーインターフェイスがブロックされるため、別のスレッドで作業を行う必要があることを示します。

を使用AsyncTaskしてネットワーク操作を行うことができます。

詳細については、Androidのプロセスとスレッドをご覧ください。

詳細については、この AsyncTaskの例を参照してください。

于 2013-02-13T11:30:08.047 に答える
1

次のような非同期タスクを作成します。

private class RetreiveDataAsynctask extends AsyncTask<String loginUrlString, Void, JSONObject> {

    @Override
    protected Response doInBackground(Void... params) {
        JSONObject obj = getJSONfromURL( loginUrlString);
        return obj;
    }

    @Override
    protected void onPostExecute(JSONObject obj) {
         //Do all ur UI related stuff as this will be executing in ui thread

        super.onPostExecute(result);
    }


}

そして、あなたのOnCreateで

RetreiveDataAsynctask mRetreiveData = new RetreiveDataAsynctask();
        mRetreiveData.execute();
于 2013-02-13T11:35:54.697 に答える
0

これを試して:

class Communicator extends AsyncTask<String, String, String> 
    {
        @Override
        protected String doInBackground(String... params) {
            //Here call the method for parsing
        }

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

        @Override
        protected void onPostExecute(String result) 
        {
            super.onPostExecute(result);
        }
    }

//And on callLoginService(View v) you start the AsyncTask
        //if you want to pass some value
        String values[] = { userna, passwo };
        new Communicator().execute(values); 
        //Otherwise
        new Communicator().execute(); 
于 2013-02-13T11:36:10.750 に答える
0

非同期タスクを使用してURLからJsonを取得します。またはメソッドの2行の下に追加します

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2013-02-13T11:37:33.547 に答える