java - একটি মান পাস করার সাথে অ্যাসিঙ্কটাস্ক ব্যবহার করা



android json (1)

আমি এটি নিয়ে কাজ করছি এবং আমি এমন একটি পয়েন্ট পেয়েছি যেখানে আমি কী করব জানি না। আমি যা করার চেষ্টা করছি তা হ'ল একটি ক্লাস ব্যবহার করে কোনও ফাইলকে স্ট্রিংয়ের মধ্যে ডাউনলোড এবং পার্স করা এবং তারপরে JSON স্টাফগুলি পার্স করার জন্য সেই স্ট্রিংটিকে অন্য শ্রেণিতে প্রেরণ করুন। সমস্ত অংশগুলি নিজেরাই সূক্ষ্মভাবে কাজ করে এবং আমি পৃথকভাবে সমস্ত কিছু পরীক্ষা করেছি। পার্সিং শুরু করার জন্য কীভাবে জসন পার্সে মান প্রেরণ করা যায় তা আমি জানি না।

সুতরাং এটি আমার ফাইলডাউনলোডার ক্লাস।

  public class JsonFileDownloader extends AsyncTask<String, Void, String> {
  //used to access the website
  String username = "admin";
  String password = "admin";
  public String ret = "";



  @Override
  protected String doInBackground(String... params) {
      Log.d("Params ", params[0].toString());
      readFromFile(params[0]);
      return ret;
  }

  private String readFromFile(String myWebpage) {

      HttpURLConnection urlConnection = null;

      try {
          //Get the url connection
          URL url = new URL(myWebpage);
          Authenticator.setDefault(new Authenticator() {
              @Override
             protected PasswordAuthentication getPasswordAuthentication()   {
                  return new PasswordAuthentication(username,   password.toCharArray());
            }
          });
          urlConnection = (HttpURLConnection) url.openConnection();

          InputStream inputStream = urlConnection.getInputStream();


          if (inputStream != null) {
              ret = streamToString(inputStream);
              inputStream.close();
              Log.d("Final String", ret);
          }

      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          if (urlConnection != null) {
              urlConnection.disconnect();
          }
          return ret;

      }
  }
  public static String streamToString(InputStream is) throws IOException   {

      StringBuilder sb = new StringBuilder();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
      String line;
        while ((line = rd.readLine()) != null) {
          sb.append(line);
      }
       return sb.toString();
   }

  public String getJsonData()
  {
      return ret;
   }

}

এটি সূক্ষ্মভাবে কাজ করে আমি কোনও ত্রুটি ছাড়াই এটি পরীক্ষা করে দেখেছি। পরেরটি জসন পার্সার যা এই জাতীয়।

public class JSONParser {

JSONObject jsonResponse;
String jsonData;

//Consturctor
public JSONParser()
{
    //this.jsonData = jsonData;
    // this.OutputData = outPutData;
}

public void parsesData(String promo,
                       ArrayList<String> pictureHTTP,
                       ArrayList<String> pathHTTP,
                       ArrayList<String> labelText) throws IOException {

    //Build the Json String
    JsonFileDownloader jfd = new JsonFileDownloader();
   // jsonData = String.valueOf(jfd.execute(promo));
    jfd.execute(promo);
    //jfd.getResuts(jsonData);
    //jsonData = jfd.ret;

    Log.d("JsonData String = " , jsonData);


    //Try to parse the data
    try
    {

        Log.d("Jsondata " , jsonData);
        //Creaate a new JSONObject ith the name/value mapping from the JSON string
        jsonResponse = new JSONObject(jsonData);
        //Returns the value mapped by the name if it exists and is a JSONArry
        JSONArray jsonMainNode = jsonResponse.optJSONArray("");

        //Proccess the JSON node
        int lenghtJsonArrar = jsonMainNode.length();
        for (int i = 0; i<lenghtJsonArrar; i++)
        {
            //Get object for each json node
            JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
            //Get the node values
            //int song_id = Integer.parseInt(jsonChildNode.optString("song_id").toString());
            String picture = jsonChildNode.optString("picture").toString();
            String pathName = jsonChildNode.optString("path").toString();
            String lableName = jsonChildNode.optString("label".toString());
            //Debug Testing code
            pictureHTTP.add(picture);
            pathHTTP.add(pathName);
            labelText.add(lableName);


        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

এখন আমি জানি কোথায় সমস্যা হচ্ছে। আমি যখন jsonData এ একটি মান নির্ধারণ করার চেষ্টা করি তখন কখনই এটি বরাদ্দ করা হয় না তাই এটি নাল হয় এবং সিস্টেমটি ব্যর্থ হয়। আমি jfd.exicute () এর পরে কয়েকটি জিনিস চেষ্টা করেছি তবে আমি কীভাবে জেসনডাটাতে চূড়ান্ত স্ট্রিং আউটপুট থেকে মান পেতে পারি তা জানি না। এটির জন্য যে কোনও সহায়তার জন্য আপনাকে ধন্যবাদ।


ঠিক আছে, ওয়েব সামগ্রী ডাউনলোড করতে অ্যাসিঙ্কটাস্ক ব্যবহারের সামগ্রিক ব্যবহারের জন্য এবং এটি থেকে ইউআই থ্রেডে ফিরে আসা ফলাফলের জন্য একদম নমনীয় নিদর্শন is

পদক্ষেপ 1 এমন একটি ইন্টারফেস সংজ্ঞায়িত করুন যা AsyncTask এর মধ্যে একটি বার্তা বাস হিসাবে কাজ করবে এবং যেখানে আপনি ডেটা চান।

public interface AsyncResponse<T> {
    void onResponse(T response);
}

পদক্ষেপ 2 জেনেরিক অ্যাসিঙ্কটাস্ক এক্সটেনশন তৈরি করুন যা কোনও ইউআরএল নেবে এবং এ থেকে ফলাফলগুলি ফিরিয়ে দেবে। আপনি মূলত এটি ইতিমধ্যে ছিল, কিন্তু আমি কিছু টুইট। সর্বাধিক গুরুত্বপূর্ণভাবে, AsyncResponse কলব্যাক ইন্টারফেসের সেটিংকে মঞ্জুরি দেওয়া হচ্ছে।

public class WebDownloadTask extends AsyncTask<String, Void, String> {

    private AsyncResponse<String> callback;

    // Optional parameters
    private String username;
    private String password;

    // Make a constuctor to store the parameters
    public WebDownloadTask(String username, String password) {
        this.username = username;
        this.password = password;
    }

    // Don't forget to call this
    public void setCallback(AsyncResponse<String> callback) {
        this.callback = callback;
    }

    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        return readFromFile(url);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (callback != null) {
            callback.onResponse(s);
        } else {
            Log.w(WebDownloadTask.class.getSimpleName(), "The response was ignored");
        }
    }

    /******* private helper methods *******/

    private String streamToString(InputStream is) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    }

    private String readFromFile(String myWebpage) {

        String response = null;
        HttpURLConnection urlConnection = null;

        try {
            //Get the url connection
            URL url = new URL(myWebpage);

            // Unnecessary for general AsyncTask usage
            /* 
            Authenticator.setDefault(new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password.toCharArray());
                }
            });
            */

            urlConnection = (HttpURLConnection) url.openConnection();

            InputStream inputStream = urlConnection.getInputStream();

            if (inputStream != null) {
                response = streamToString(inputStream);
                inputStream.close();
                Log.d("Final String", response);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }

        return response;
    }
}

পদক্ষেপ 3 এগিয়ে যান এবং যেখানে আপনি চান সেখানে AsyncTask ব্যবহার করুন। এখানে একটি উদাহরণ। মনে রাখবেন যে আপনি যদি setCallback ব্যবহার না করেন তবে আপনি setCallback থেকে আসা ডেটা পেতে অক্ষম হবেন।

public class MainActivity extends Activity {

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

        WebDownloadTask task = new WebDownloadTask("username", "password");
        task.setCallback(new AsyncResponse<String>() {
            @Override
            public void onResponse(String response) {
                // Handle response here. E.g. parse into a JSON object
                // Then put objects into some list, then place into an adapter... 
                Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
            }
        });

        // Use any URL, this one returns a list of 10 users in JSON
        task.execute("http://jsonplaceholder.typicode.com/users");
    }
}




android-asynctask